2011-09-19 74 views
1

以下是我的理解,JTA/JTS处理事务超时问题。但是我找不到我的文档或材料来支持我的理解。我的理解是正确的吗?你知道任何材料是指这个问题吗?JTA/JTS如何处理交易超时问题?

Application Server遍历所有事务以检查超时。如果发生事务超时,则应用程序服务器标记回滚事务,并记录详细信息。 但是Application Server既不会抛出异常也不会中断事务。当事务线程继续尝试访问另一个事务资源(如JDBC/JMS)时,实现JTA接口的事务资源将在继续之前先检查回退标志。然后在这个时候抛出RollbackException。

==========

测试案例1: 设置事务超时10秒

一交易开始

II。睡眠20秒

三。系统输出“睡眠结束”

结果:超时发生在第10秒,系统输出记录超时细节,但不抛出异常。 “睡眠结束”将被打印。

==========

测试案例2: 设置事务超时10秒

一交易开始

II。睡眠20秒

三。访问db第一次

四。 Access数据库第2次

五,制出“休眠结束”

结果:超时发生在第10秒,并制出记录下来超时的细节,而不是抛出异常。第一次访问数据库时抛出异常。 “睡眠结束”将不会被打印。

==========

测试案例3: 设置事务超时10秒

一交易开始

II。访问数据库和数据库死锁

结果:超时发生在第10秒,系统输出记录超时详细信息。没有异常抛出,事务线程卡住了。 因此,事务超时控制无法处理数据库超时问题。我对此很困惑。

在我的理解中,使用spring事务管理(JTA)和EJB时,上述行为应该是相同的。我对吗?

感谢您的帮助!

回答

3

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

总结如下结果:

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

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

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