Spring程序化事务

时间:2013-02-25 11:14:19

标签: java spring transactions

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

目前,我将隔离设置为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();
}

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

我不确定我的“解决方法”是否有效,因为我现在无法测试它。 但是 - 如果使用anotation(@Transactional)进行定义事务,则只有在名为external的方法时才会创建事务。不是方法调用自我。这是因为代理。

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