我的代码具有以编程方式划分的事务。
目前,我将隔离设置为PROPAGATION_REQUIRES_NEW
。哪个工作正常,但我需要满足递归行为,并且如果从同一个线程再次调用该方法,我不希望创建新的事务。
1)如果第一次调用该方法,则暂停当前事务并创建新事务。 PROPAGATION_REQUIRES_NEW
2)如果以递归方式调用它。不要创建新的交易。
示例:我拥有的功能是什么。我不想要的是使用entrancy AtomicInterger。有什么想法吗?
public methoda() {
Integer entrancy = rentrancy.incrementAndGet();
if(entrancy == 1) {
this.transactionTemplate.setPropagationBehavior(..PROPAGATION_REQUIRES_NEW);
}
this.transactionTemplate.execute(new TransactionCallback<E>(){
.......
.......
}
entrancy.decrementAndGet();
}
答案 0 :(得分:1)
听起来PROPAGATION_REQUIRED更适合您的目的。来自它的javadoc:
支持当前交易;如果不存在,则创建一个新的。
答案 1 :(得分:0)
我不确定我的“解决方法”是否有效,因为我现在无法测试它。 但是 - 如果使用anotation(@Transactional)进行定义事务,则只有在名为external的方法时才会创建事务。不是方法调用自我。这是因为代理。
“注意:由于此机制基于代理,因此只有通过代理进入的'外部'方法调用才会被截获。这意味着'自我调用',即目标对象中的一个方法调用其他方法即使被调用的方法用@Transactional标记,目标对象也不会在运行时导致实际的事务! http://static.springsource.org/spring/docs/2.0.x/reference/transaction.html