【问题标题】:Whether and When Spring Lock Table if Method Annotated with Transactional如果方法使用事务性注释,是否以及何时使用 Spring Lock Table
【发布时间】:2018-10-03 00:25:30
【问题描述】:

这个问题来自那个,如果我有一个methodA,并且classA中有methodB,如下所示

public class classA {
    public void methodA() {
        // some code
        ...

        // time to deal with db
        methodB();
    }

    @Transactional
    public void methodB() {
        // insert a record 

        throw new RuntimeException("testing");
    }
}

classB中直接调用methodA,不会对methodB产生事务影响(也就是说spring不会回滚插入操作,即使RuntimeException发生了)。

当我将@Transactional 从methodB 移动到methodA,并再次调用methodA 时,@Transactional 注释起作用。

但是,如果我在methodA 真的有很多工作要做,会不会在总执行时间内弹簧锁表?

【问题讨论】:

  • 这取决于您的隔离级别和数据库。

标签: spring spring-transactions transactional


【解决方案1】:

好吧,我将添加一个新类(即 classC)并将方法 B(使用 Transactional 注释)移动到新类作为解决方法。

Springs AOP的限制是@Transactional如果在同一个类中调用该方法将不起作用。
参考@Transactional method called from another method doesn't obtain a transaction

【讨论】:

    【解决方案2】:

    Spring 不自己处理事务。 @Transactional 注释让 Spring 的代理类可以围绕原始方法注入事务开始和提交/回滚方法。

    • 仅当您从类外部调用带注释的方法时,才会调用代理包装器。本地方法调用不会使用代理类。因此,从方法 A 调用方法 B 将不会使用事务功能。
    • 其次,Spring 将简单地将事务处理委托给底层数据库驱动程序。您的表是否获得锁将取决于您的驱动程序文档和(原子性和隔离级别)设置。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-25
      • 2021-08-16
      • 2013-08-15
      相关资源
      最近更新 更多