我们有一个可能持续几秒到几分钟的过程。因此,我们可能只更新几条或数千条记录。只有在所有操作都正确的情况下,才能提交该过程。
最近,我们在尝试提交事务时出现了问题,因为它们被标记为"rollbackOnly“。我发现,事实上,事务被标记为"rollbackOnly“,因为它提前了一段时间(在日志文件中看不到,因为我们的应用服务器是Websphere,它的事务管理器只给出一行警告),因此无法提交。当然,您不能提交超时的事务是有意义的。
问题在于,我们从未在事务定义中设置事务超时,在这种情况下,超时的值是在应用服务器级别设置的值(参见Websphere的事务设置,关于“总事务生存期超时”的段落)。这个值是2分钟,有时我们会超过它。
现在,这说明了设置(如果有人遇到"rollbackOnly“事务,我在这里提供了一个可能的解释)。
我很想增加超时,但我在文档中也看到,超时可以设置为0,这意味着没有超时。
因此,我的问题是:设置无限事务生命超时有什么危险?
请注意,我知道我的问题的编程/数据库解决方案,比如处理临时表,以及当我们知道一切都做对了(例如使用PL/SQL )时,将数据从临时表倒转到真正的表。我只是对事务超时这件事很好奇。
发布于 2011-11-09 08:24:26
大多数数据库没有自动死锁检测,因此超时是阻止这些死锁的唯一方法。超时也会损害长时间运行的事务,但是如果没有超时,第一个死锁将停止应用程序。
发布于 2017-08-10 08:21:10
让我用一句话回答你:
无限是非常长的。即使到了太阳变成红巨星(爆炸)的时候,它仍然是通往无限的一条路。程序员平均72岁就死了。根本没有现实世界的情况,在那里我们想等那么久。无限的超时只是一件荒谬的事情。用一个小时,一天,一周,一个月,一年,十年。但不是无限。(来源)
想想你想让你的用户做什么,这取决于它对系统的影响。启动事务,让web浏览器处于打开状态,然后使用…去吃午饭?回家?晚上吗?在周末吗?三个星期的假期?…然后,相应地设置你的超时时间。
发布于 2011-11-09 14:20:28
问题是您可能会锁定资源很长一段时间。即使您的行锁没有升级到表锁,您也可能会在表和任何相关索引中锁定一组记录,这会阻止其他进程访问它们。如果程序在不关闭连接的情况下挂起或被终止,那么这些表可能会被锁定数小时。
您可以尝试将超时时间提高到(例如)5分钟,看看这是否有帮助,但对于完全禁用它,我会非常谨慎。
https://softwareengineering.stackexchange.com/questions/118708
复制相似问题