spring - 各个级别的 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:回滚时出现意外错误”异常,我怀疑上面提到的代码导致问题。
解决方案
@Transactional.isolation
好吧,用于状态的 Javadoc :
专为与 Propagation.REQUIRED 或 Propagation.REQUIRES_NEW 一起使用而设计,因为它仅适用于新启动的事务。如果您希望在参与具有不同隔离级别的现有事务时拒绝隔离级别声明,请考虑将事务管理器上的“validateExistingTransactions”标志切换为“true”。
而 Javadoc forAbstractPlatformTransactionManager.validateExistingTransactions
说:
当参与现有事务时(例如,使用 PROPAGATION_REQUIRED 或 PROPAGATION_SUPPORTS 遇到现有事务),此外部事务的特征甚至适用于内部事务范围。验证将检测内部事务定义上不兼容的隔离级别和只读设置,并通过抛出相应的异常来拒绝参与。
默认为“false”,忽略内部事务设置,简单地用外部事务的特征覆盖它们。将此标志切换为“true”以强制执行严格验证。
从上面你可以得出结论,如果不validateExistingTransactions
设置 to true
,事务将简单地继续,即使隔离级别与请求的不同。“外部”事务特征优先。
推荐阅读
- angular - 角度单元测试异步与同步问题
- powerbi - Power Bi压光机
- c++ - 使用模板元编程 C++ 比较 2 个值
- docker - apache 没有在 alpine image docker 中启动
- sql - ORDER BY 具有 JOIN、LEFT JOIN 和 UNION 的子查询
- php - 如何从类别自定义字段中获取值?
- python - 计算价格变化(最后 2 分钟)和价格范围(2 分钟前)
- android - 升级毕加索库时 Android 崩溃
- oauth - 我们可以使用来自不同机器的相同 OAuth 不记名令牌进行 API 调用吗
- c# - 从下拉C#中选择值而不是索引