0

次のような特定のメソッドを使用したサービス実装があります。

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 からのすべての挿入および更新はロールバックされますか?

4

1 に答える 1

1

はい。トランザクションの側面により、アノテーション付きメソッドが呼び出される前にトランザクションが開始され、メソッドが返されるとトランザクション (このメソッドによって開始された場合) がコミットまたはロールバックされることが保証されます。

トランザクション インターセプターは、注釈付きメソッド内で他のどのメソッドが呼び出されているかを知りません (気にしません)。Spring トランザクション マネージャーによって処理される DataSource へのすべての読み取りと書き込みは、同じトランザクションに含まれます。

于 2013-04-22T21:46:18.977 に答える