Springを使用していて、宣言型トランザクションを使用している2つのメソッドがあります...
場合によっては、methodAがmethodBを呼び出します。私が知る必要があるのは、宣言型のトランザクションで、コミットが2回発生するかどうかです。
例
public void methodA() throws Exception {
this.transactionTemplate.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED)
final Order order = this.transactionTemplate.execute(new TransactionCallback<Order>() {
@Override
public Order doInTransaction(TransactionStatus status) {
Order order = new Order();
String name = "Customer 2 " + (new Date()).toLocaleString();
order.setCustomer(name);
entityManager.persist(order);
..........................
.......................
// call methodB
methodB();
}
public void methodB() throws Exception {
this.transactionTemplate.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
final Address add = this.transactionTemplate.execute(new TransactionCallback<Address >() {
@Override
public Order doInTransaction(TransactionStatus status) {
Address add= new Address ();
add.setAddress("address");
entityManager.persist(add);
......................
.....................
}
PROPOGATION_REQUIREDを使用すると、methodBのトランザクションは、methodAで開始されたトランザクションに参加します。
しかし、これはトランザクションが2回コミットされることを意味しますか?
methodBのトランザクションにsychronizerを追加しました:
TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization(){
public void afterCommit() {
System.out.println("====> AFTER SUCCESSFUL COMMIT 2 TO DB...");
}
methodAのトランザクションにシンクロナイザーを追加しました:
TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization(){
public void afterCommit() {
System.out.println("====> AFTER SUCCESSFUL COMMIT 1 TO DB...");
}
私が得た出力は、methodAが完了した後のものでした::
====> AFTER SUCCESSFUL COMMIT 2 TO DB...
====> AFTER SUCCESSFUL COMMIT 1 TO DB...
これは、2つのシンクロナイザーがtrans..managerに割り当てられており、コミットが1回発生すると、両方のシンクロナイザーが呼び出されることを意味しますか?..正しいですか?