2013-02-25 153 views
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(); 
} 

回答

1

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

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

+0

不,它不会因为我第一次调用这个方法时需要一个新的事务。但如果它递归,我不想要另一个新的交易。 – user1555190 2013-02-25 13:37:49

+2

我会以一种只在第一次调用时创建事务的方式来重构代码,也许会将这个方法拉到另一个方法。这比干扰条件传播模式等干净。 – mrembisz 2013-02-25 13:53:12

0

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

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