-1

我使用 Spring 并有两种使用声明性事务的方法......

在某些情况下methodA调用methodB ..我需要知道的是在声明性事务中提交是否发生两次......

例子

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

但这是否意味着事务被提交了两次?

我在 methodB 的事务中添加了同步器:

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..."); 


                }

我得到的输出是在方法A完成之后::

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

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

4

1 回答 1

0

由于您正在使用PROPAGATION_REQUIRED不会有两个不同的事务,因此两种方法都将在同一个事务中运行。如果你看它的定义PROPAGATION_REQUIRED

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

.

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

于 2013-03-01T16:16:39.923 回答