-1

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回発生すると、両方のシンクロナイザーが呼び出されることを意味しますか?..正しいですか?

4

1 に答える 1

0

使用してPROPAGATION_REQUIREDいるのは2つの異なるトランザクションがないため、両方のメソッドが同じトランザクション内で実行されます。あなたがそれの定義を見ればPROPAGATION_REQUIRED言う

現在のトランザクションをサポートします。存在しない場合は、新しいものを作成します。

したがって、methodB正常に完了するとトランザクションはコミットされませんが、失敗するとトランザクションはとしてマークされrollback-onlyます。実際にコミットまたはロールバックする責任は、トランザクションを作成した人にあります。あなたの場合、それはオンになりますmethodA

于 2013-03-01T16:16:39.923 に答える