JTA / JTS如何处理事务超时问题?

时间:2011-09-19 10:43:25

标签: spring transactions timeout ejb jta

以下是我的理解,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时,上述行为应该是相同的。我是对的吗?

感谢您的帮助!

1 个答案:

答案 0 :(得分:3)

经过测试,证明我的理解应该是正确的。

总结如下结果:

•事务超时控制仅影响事务活动(例如:访问DB /发送JMS消息)。

•应用程序服务器在发生超时时不会立即中断当前事务线程,而是应用程序服务器仅记录详细信息。在事务提交或尝试访问下一个事务活动时抛出超时异常。

•事务超时控制无法处理数据库死锁问题。但是DB2在某些情况下有死锁防止机制来释放死锁并回滚事务。