当我在项目中使用@Transactional
时,我将超时设置为60秒。
但是在运行了60秒钟以上之后,事务并没有立即回滚,它只是调用setRollbackOnly()
方法将事务标记为仅回滚,而当事务尝试提交时,它检测到仅回滚标记和回滚。
我想知道为什么我们需要setRollbackOnly()
?我们为什么不只打电话给rollback()
?
这是JTA的设计吗?
答案 0 :(得分:0)
实际上,当当前事务中出现问题(例如某些异常)时,将调用回滚。 在这里,您要手动设置60秒的超时时间。
情况1:如果Transaction在指定时间内执行,那么它将提交。
情况2:如果交易在一段时间内由于某些异常而出错,那么它将直接调用rollback()
;
情况3:如果交易未及时完成,则会设置一个标志setRollbackOnly()
。
此事务也将执行,即使事务在60秒后成功,由于存在setRollbackOnly()
标志,它也不会提交。