1

我有以编程方式划分事务的代码。

目前我将隔离设置为PROPAGATION_REQUIRES_NEW. 效果很好,但是我需要满足递归行为,为此,如果从同一线程再次调用该方法,我不希望创建新事务。

1) 如果该方法是第一次调用,则暂停当前事务并创建新事务。PROPAGATION_REQUIRES_NEW

2)如果它被递归调用。不要创建新事务。

示例:我所拥有的并且有效的是。我不想要的是使用入口AtomicInterger。有任何想法吗?

public methoda() {

  Integer entrancy = rentrancy.incrementAndGet(); 

   if(entrancy == 1) { 
          this.transactionTemplate.setPropagationBehavior(..PROPAGATION_REQUIRES_NEW);
   }

   this.transactionTemplate.execute(new TransactionCallback<E>(){
         .......
         .......
   }
   entrancy.decrementAndGet();
}
4

2 回答 2

1

听起来 PROPAGATION_REQUIRED 更适合您的目的。从它的javadoc:

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

于 2013-02-25T11:58:55.843 回答
0

我不确定我的“解决方法”是否有效,因为我现在无法测试它。但是 - 如果您使用注释(@Transactional)来定义事务,那么只有在方法调用外部时才会创建事务。如果方法调用 self. 这是因为代理。

“注意:由于这种机制是基于代理的,只有通过代理传入的‘外部’方法调用会被拦截。这意味着‘自调用’,即目标对象中的一个方法调用目标对象的一些其他方法,即使调用的方法标有@Transactional,也不会在运行时导致实际事务!" http://static.springsource.org/spring/docs/2.0.x/reference/transaction.html

于 2013-02-26T15:06:55.037 回答