以下是我对JTA/JTS处理事务超时问题的理解。但是我找不到我的文件或材料来支持我的理解。我的理解对吗?你知道关于这个问题有什么资料吗?
Application Server遍历所有事务以检查超时。如果发生事务超时,应用服务器将为该事务标记回滚,并记录详细信息。但是此时应用服务器既没有抛出异常也没有中断事务。当事务线程继续尝试访问另一个事务资源(如JDBC/JMS)时,实现JTA接口的事务资源将首先检查回滚标志,然后再进行下一步操作。此时,抛出RollbackException。
==========
测试案例1:设置事务超时为10秒
。事务开始
二世。睡眠20秒
III。系统输出"Sleep end"
结果:超时发生在第10秒,系统退出记录超时细节,但不抛出异常。输出"Sleep end"
==========
测试用例2:设置事务超时为10秒
。事务开始
二世。睡眠20秒
III。第一次访问数据库
第四。访问数据库第2次
V。系统输出"Sleep end"
Result:超时发生在第10秒,并且system out记录超时细节,但不抛出异常。第一次访问数据库时抛出异常。"Sleep end"将不打印。
==========
测试用例3:设置事务超时为10秒
。事务开始
二世。访问db和db死锁
Result:超时发生在第10秒,system out记录超时详情。没有抛出异常,事务线程被卡住。所以事务超时控制不能处理数据库超时问题。我很困惑……
在我的理解中,上述行为在使用spring事务管理(JTA)和EJB时应该是相同的。我说的对吗?
谢谢你的帮助!
经过测试,证明我的理解应该是正确的。
将结果总结如下:
•事务超时控制只影响事务活动(例如:访问DB/发送JMS消息)。
•当超时发生时,应用服务器不立即中断当前事务线程,相反,应用服务器只记录细节。当事务提交或尝试访问下一个事务活动时,将抛出超时异常。
•DB死锁问题不能通过事务超时控制来处理。但是在某些情况下,DB2有防止死锁的机制来释放死锁并回滚事务。