【问题标题】:Why do we need setRollbackOnly, not just rollback the transaction?为什么我们需要setRollbackOnly,而不仅仅是回滚事务?
【发布时间】:2020-06-02 05:39:14
【问题描述】:
当我在我的项目中使用@Transactional 时,我将超时设置为 60 秒。
但是进程运行超过60秒后,事务并没有立即回滚,它只是调用setRollbackOnly()方法将事务标记为仅回滚,当事务尝试提交时检测到回滚仅标记并回滚.
我想知道为什么我们需要setRollbackOnly()?我们为什么不直接打电话给rollback()?
这是JTA的设计吗?
【问题讨论】:
标签:
java
spring
transactions
jta
【解决方案1】:
实际上,当当前事务中出现问题(即一些异常)时,会调用回滚。
在这里您手动设置超时 60 秒。
案例1:如果Transaction在规定时间内执行,则提交。
案例2:如果Transaction在一定时间内因为一些异常而出错,那么它会直接调用rollback();
案例3:如果交易没有在规定时间内完成,则设置一个标志setRollbackOnly()。
在此之后事务也会执行,即使事务在 60 秒后成功也不会提交,因为有 setRollbackOnly() 标志。