【问题标题】:Spring programmatic transactionSpring 程序化事务
【发布时间】:2013-02-25 11:14:19
【问题描述】:

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

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

【问题讨论】:

    标签: java spring transactions


    【解决方案1】:

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

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

    【讨论】:

    • 不会,因为第一次调用此方法时我需要一个新事务。但如果它是递归的,我不想要另一个新事务。
    • 我会以一种仅在第一次调用时创建事务的方式重构代码,也许将其拉到另一个方法。这将比使用条件传播模式等更干净。
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-21
      • 1970-01-01
      • 2014-03-05
      相关资源
      最近更新 更多