@Transactional 在私有方法上的传播

Posted

技术标签:

【中文标题】@Transactional 在私有方法上的传播【英文标题】:@Transactional propagation on private methods 【发布时间】:2015-12-19 11:26:37 【问题描述】:

我有以下代码:

@Service
public class MyService implements IMyService 
    @Inject
    IAnotherService anotherService;
    // injects go here
    // some code
    @Transactional(isolation=Isolation.SERIALIZABLE)
    public Result myMethod() 
        // stuff done here
        return this.myPrivateMethod()
     

    private Result myPrivateMethod() 
         // stuff done here
         // multiple DAO SAVE of anObject
         anotherService.processSomething(anObject);
         return result; 
    


@Service
public class AnotherService implements IAnotherService 
      // injections here
      // other stuff

      @Transactional(isolation=SERIALIZABLE)
      public Result processSomething(Object anObject) 
         // some code here
         // multiple dao save
         // manipulation of anObject
         dao.save(anObject);
      

    @Transactional 行为是否会传播到 myPrivateMethod,即使它是私有的? 如果Runtime Exception 出现在processSomething() 上,并且从myPrivateMethod 调用processSomething,那么myPrivateMethodmyMethod 会回滚吗? 如果对 1 和 2 的回答是否定的,我怎样才能在不创建另一个 @Service 的情况下做到这一点?如何在 @Transactional 上下文中的公共服务方法中提取方法并调用多个私有方法?。 isolation=Isolation.SERIALIZABLE 选项是 synchronized 方法的良好替代品吗?。

我知道这个问题已经得到解答,但我仍然有疑问。

【问题讨论】:

到目前为止你找到的答案告诉你什么? 1. 是 2. 是 3. 不适用,因为 1 && 2 4. 不,因为它只有在事务容器中调用该方法时才有效。 ***.com/questions/4396284/… ---> 找到了一些可以部分回答我的问题的参考资料,但主要主题并不集中在与我相同的案例上。我真的必须确定事务注释是否真的适用于我的情况。对于问题 4:如果我强制 Propagation.MANDATORY? 【参考方案1】:
    如果从带有 @Transactional 注释的公共方法调用 myPrivateMethod,则会传播它。 如果第一个条件为 TRUE 是,它将回滚。 比较数据库的隔离级别和类方法的同步是一种误解。他们根本不应该被比较。如果您的方法将在多线程环境中使用,您应该同步方法(请注意,在某些情况下,拥有线程安全代码是不够的)。隔离级别 SERIALIZABLE 用于数据库级别。它是最严格的隔离级别,它可以在你运行一些查询时锁定很多表,在它完成之前,帮助你的数据不会变成一些不一致的状态。您应该确定您需要这种级别的隔离,因为这可能会导致性能问题。所以答案是否定的。

【讨论】:

以上是关于@Transactional 在私有方法上的传播的主要内容,如果未能解决你的问题,请参考以下文章

spring @Transactional 传播机制(参数 propagation )

Spring @Transactional 属性是不是适用于私有方法?

Spring 之注解事务 @Transactional

Spring 忽略 @Transactional 注释

@Transactional(传播=传播。需要)

Spring事务的传播行为