以下是我的理解,JTA / JTS处理事务超时问题。但我无法找到我的文件或材料来支持我的理解。我明白了吗?你知道有什么材料可以参考这个问题吗?
Application Server遍历所有事务以检查超时。如果发生事务超时,应用程序服务器会标记回滚事务,并记下详细信息。 但是Application Server既不会抛出异常也不会中断事务。当事务线程继续尝试访问另一个事务资源(如JDBC / JMS)时,实现JTA接口的事务资源将检查回滚在进一步发展之前先举旗。然后此时抛出RollbackException。
==========
测试案例1: 将事务超时设置为10秒
予。交易开始
II。睡20秒
III。系统输出“睡眠结束”
结果:超时发生在第10秒,系统输出记录超时详细信息,但不抛出异常。 “睡眠结束”将被打印出来。
==========
测试案例2: 将事务超时设置为10秒
予。交易开始
II。睡20秒
III。第一次访问db
IV。第二次访问数据库
诉系统输出“睡眠结束”
结果:超时发生在第10秒,系统输出记录超时详细信息,但不会抛出异常。第一次访问db时抛出异常。 “睡眠结束”将不会被打印出来。
==========
测试案例3: 将事务超时设置为10秒
予。交易开始
II。访问db和db deadlock
结果:超时发生在第10秒,系统输出记录超时详细信息。没有异常抛出,事务线程被卡住了。 因此事务超时控制无法处理数据库超时问题。我对此感到困惑..
根据我的理解,使用spring transaction management(JTA)和EJB时,上述行为应该是相同的。我是对的吗?
感谢您的帮助!
答案 0 :(得分:3)
经过测试,证明我的理解应该是正确的。
总结如下结果:
•事务超时控制仅影响事务活动(例如:访问DB /发送JMS消息)。
•应用程序服务器在发生超时时不会立即中断当前事务线程,而是应用程序服务器仅记录详细信息。在事务提交或尝试访问下一个事务活动时抛出超时异常。
•事务超时控制无法处理数据库死锁问题。但是DB2在某些情况下有死锁防止机制来释放死锁并回滚事务。