弹簧锁表是否以及何时使用Transactional注释方法

时间:2018-04-23 03:17:09

标签: spring spring-transactions transactional

这个问题来自于,如果我在classA中有methodA和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没有任何事务影响(这就是说,即使发生了RuntimeException,spring也不会回滚插入操作)。

当我将@Transactional从methodB移动到methodA,并再次调用methodA时,@Transactional注释可以正常工作。

但是,如果我在methodA中有很多工作要做,那么会在总执行时间内锁定表吗?

2 个答案:

答案 0 :(得分:0)

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

如果在同一个类中调用该方法,则弹簧AOP的限制是@Transactional不起作用。
请参阅@Transactional method called from another method doesn't obtain a transaction

答案 1 :(得分:0)

Spring本身不处理事务。 @Transactional注释允许Spring的代理类围绕原始方法注入事务开始和提交/回滚方法。

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