对交易服务的理解 - 春天

时间:2013-04-22 21:37:44

标签: java spring transactions

我有一个特定方法的服务实现:

public class ExampleServiceImpl implements ExampleService {
  @AutoWired
  @Resource
  private RecordRepository recordRepository;

  private void processRecord() {
     // some code here
  }
  @Transactional(readOnly=false)
  public void processRecord(Record a) {
     Record original = getOriginal(a);
     recordRepository.saveChanges(a,original);
  }
}

Record类是对象图的根对象。 RecordRepository看起来像下面的子存储库,以保存图中对象的各种子项。

public class RecordRepository extends BaseRepository<Record> {
   @AutoWired
   @Resource
   private IDao databaseDao;

   @AutoWired
   @Resource
   private SubRecordRepository subRecordRepository;

   public void saveChanges(Record a, Record b) {
      //Perform some processing on a, b
      for(SubRecord subA : a.getSubRecords()) {
         subRecordRepository.saveChanges(subA);
      }
      databaseDao.updateRecord(a);
   }
}

public class DatabaseDao extends NamedParameterJdbcDaoSupport implements IDao {

   @Autowired
   public DatabaseDao(@Qualifier("org.somewhere.Datasource") DataSource ds) {
       super();
       this.setDataSource(ds);
   }

   public void updateRecord(Record inRecord) {
       String query = (String) sql.get("updateRecord");
       SqlParameterSource parms = new BeanPropertySqlParameterSource(inRecord);
       getNamedParameterJdbcTemplate().update(query, parms);
   }

   public void insertSubRecord(SubRecord inSubRecord) {
       String query = (String) sql.get("insertSubRecord");
       SqlParameterSource parms = new BeanPropertySqlParameterSource(inSubRecord);
       getNamedParameterJdbcTemplate().insert(query, parms);
   }

   // other update and insert methods
} 

是否会在processRecord调用的所有涉及的插入\更新中应用事务?换句话说,如果插入或更新失败,是否会回滚来自ExampleServiceImpl.processRecord的所有先前调用的插入和更新?

1 个答案:

答案 0 :(得分:1)

是。事务方面确保在调用带注释的方法之前启动事务,并且在方法返回后提交或回滚事务(如果由此方法启动)。

事务拦截器不知道(并且不关心)在注释方法中调用哪些其他方法。对Spring事务管理器处理的DataSource的每次读写都将包含在同一事务中。