Spring PROPAGATION_REQUIRED ..加入

时间:2013-03-01 15:43:28

标签: spring transactions

我使用Spring并且有两个使用声明式事务的方法......

在某些情况下,methodA调用methodB ..我需要知道的是声明性trasaction提交会发生两次...

示例

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中启动的事务。

但这是否意味着交易被提交两次?

我在方法B中为事务添加了sychronizer:

TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization(){

                    public void afterCommit() {
                        System.out.println("====> AFTER SUCCESSFUL COMMIT 2 TO DB..."); 


                    }

我在方法A中为事务添加了sychronizer:

TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization(){

                public void afterCommit() {
                    System.out.println("====> AFTER SUCCESSFUL COMMIT 1 TO DB..."); 


                }

我得到的输出是在methodA completed ::

之后
====> AFTER SUCCESSFUL COMMIT 2 TO DB...
====> AFTER SUCCESSFUL COMMIT 1 TO DB...

我想这意味着已经为trans..manager分配了两个sycnroniser,并且当提交发生一次时......两个同步器都被调用了?正确吗?

1 个答案:

答案 0 :(得分:0)

因为您使用的是PROPAGATION_REQUIRED,所以不会有两个不同的事务,这两种方法都将在同一个事务中运行。如果你看一下PROPAGATION_REQUIRED的定义,就说

  

支持当前交易;如果不存在,则创建一个新的。

因此,如果methodB成功完成,那么它将不会提交事务,但如果失败则将事务标记为rollback-only。实际提交或回滚的责任在于创建事务的人。在您的情况下,它将在methodA