为什么我们需要setRollbackOnly,而不仅仅是回滚事务?

时间:2020-06-02 05:39:14

标签: java spring transactions jta

当我在项目中使用@Transactional时,我将超时设置为60秒。 但是在运行了60秒钟以上之后,事务并没有立即回滚,它只是调用setRollbackOnly()方法将事务标记为仅回滚,而当事务尝试提交时,它检测到仅回滚标记和回滚。

我想知道为什么我们需要setRollbackOnly()?我们为什么不只打电话给rollback()? 这是JTA的设计吗?

1 个答案:

答案 0 :(得分:0)

实际上,当当前事务中出现问题(例如某些异常)时,将调用回滚。 在这里,您要手动设置60秒的超时时间。

情况1:如果Transaction在指定时间内执行,那么它将提交。

情况2:如果交易在一段时间内由于某些异常而出错,那么它将直接调用rollback();

情况3:如果交易未及时完成,则会设置一个标志setRollbackOnly()

此事务也将执行,即使事务在60秒后成功,由于存在setRollbackOnly()标志,它也不会提交。