下面是我的理解,JTA / JTS处理事务超时问题.但是我找不到我的文件或材料来支持我的理解.我的理解正确吗?您知道有关此问题的材料吗?
Application Server遍历所有事务以检查超时.如果发生事务超时,则应用程序服务器标记将回滚该事务,并记下详细信息.但是,此时Application Server既不会引发异常,也不会中断事务.当事务线程继续尝试访问另一个事务资源(如JDBC / JMS)时,实现JTA接口的事务资源将首先检查回滚标志,然后再继续.然后,此时,将抛出RollbackException.
==========
测试用例1:
将交易超时设置为10秒
一,交易开始
二.睡眠20秒
三,系统输出“睡眠结束”
结果:超时发生在第10秒,并且系统注销记录了超时详细信息,但没有引发异常.将打印“睡眠结束”.
==========
测试案例2:
将交易超时设置为10秒
一,交易开始
二.睡眠20秒
三,第一次访问数据库
IV.第二次访问数据库
V.系统退出“睡眠结束”
结果:超时发生在第10秒,并且系统注销记录了超时详细信息,但没有引发异常.第一次访问数据库时引发异常. “睡眠结束”将不会打印.
==========
测试案例3:
将交易超时设置为10秒
一,交易开始
二.访问数据库和数据库死锁
结果:超时发生在第10秒,并且系统注销记录了超时详细信息.没有异常抛出,事务线程被卡住.因此,事务超时控制无法处理数据库超时问题.我对此很困惑.
以我的理解,在使用Spring事务管理(JTA)和EJB时,上述行为应该相同.我对吗?
感谢您的帮助!
解决方法:
经过测试,证明我的理解应该是正确的.
总结结果如下:
•事务超时控制仅影响事务活动(例如:访问数据库/发送JMS消息).
•应用程序服务器不会在发生超时时立即中断当前事务线程,而是,应用程序服务器仅记下详细信息.事务提交或尝试访问下一个事务活动时,将抛出超时异常.
•事务超时控制无法处理数据库死锁问题.但是,在某些情况下,DB2具有防止死锁并释放死锁并回滚事务的机制.