首页 > 解决方案 > 各个级别的 Spring 事务是如何工作的?

问题描述

如代码所示,我有 A 类和 B 类。在提到的代码中,事务将如何表现?在B类里面,commit之后会因为isolation_level而关闭事务吗?

Class A{
 @Transactional(propagation = Propagation.REQUIRED)
    method classAMethod(){
       B b = new B();
       b.classBMethod
    }
}

Class B{
@Transactional(propagation = Propagation.REQUIRED,isolation = Isolation.READ_COMMITTED)

  method classAMethod(){
     B b = new B();
     b.classBMethod
  }

}

我正在运行一个批处理作业,一段时间后遇到“无法执行无法回滚 JPA 事务;嵌套异常是 javax.persistence.PersistenceException:回滚时出现意外错误”异常,我怀疑上面提到的代码导致问题。

标签: springjpaspring-transactions

解决方案


@Transactional.isolation好吧,用于状态的 Javadoc :

专为与 Propagation.REQUIRED 或 Propagation.REQUIRES_NEW 一起使用而设计,因为它仅适用于新启动的事务。如果您希望在参与具有不同隔离级别的现有事务时拒绝隔离级别声明,请考虑将事务管理器上的“validateExistingTransactions”标志切换为“true”。

而 Javadoc forAbstractPlatformTransactionManager.validateExistingTransactions说:

当参与现有事务时(例如,使用 PROPAGATION_REQUIRED 或 PROPAGATION_SUPPORTS 遇到现有事务),此外部事务的特征甚至适用于内部事务范围。验证将检测内部事务定义上不兼容的隔离级别和只读设置,并通过抛出相应的异常来拒绝参与。

默认为“false”,忽略内部事务设置,简单地用外部事务的特征覆盖它们。将此标志切换为“true”以强制执行严格验证。

从上面你可以得出结论,如果不validateExistingTransactions设置 to true,事务将简单地继续,即使隔离级别与请求的不同。“外部”事务特征优先。


推荐阅读