ORM支持处理死锁
你知道任何提供死锁恢复的ORM工具吗? 我知道死锁是一件坏事,但有时候任何系统都会因为负载量太大而受到影响。 在Sql Server中,死锁消息显示“重新运行事务”,因此我怀疑重新运行死锁声明是ORM的一项理想功能。
我不知道有任何特殊的ORM工具支持自动重新运行由于死锁而失败的事务。 但是我不认为ORM使得处理锁定/死锁问题有很大的不同。 首先,您应该分析死锁的根本原因,然后以避免或至少减少死锁的方式重新设计事务和查询。 有很多选择需要改进,比如为事务的(部分)选择正确的隔离级别,使用锁提示等。这取决于你的数据库系统,然后依赖于你的ORM。 当然,如果您的ORM允许您使用存储过程进行一些精细调整的命令等,这会有所帮助。
如果这无助于完全避免死锁,或者您现在没有时间来实现和测试真正的修复程序,那么您可以简单地在您的save / commit / persist或任何调用中放置try / catch,检查如果它们指出失败的事务是“死锁受害者”,那么只需调用异常,然后在睡眠几秒钟后简单地调用save / commit / persist。 等待几秒钟是个不错的主意,因为死锁通常表明事务处理暂时出现高峰,争夺相同资源,并且一次又一次快速重新运行同一事务可能会使事情变得更糟。
出于同样的原因,您可能不会确保您只尝试一次重新运行相同的事务。
在现实世界的情景中,我们曾经实施过这种解决方法,大约80%的“僵局受害者”在第二次成功。 但我强烈建议深入研究以解决死锁的实际原因,因为这些问题通常随着用户数量呈指数增长。 希望有所帮助。
可能会出现死锁,SQL Server似乎比其他数据库服务器更糟糕。 首先,你应该尽量减少你的死锁。 尝试使用SQL Server Profiler找出它发生的原因以及您可以对此做些什么。 接下来,如果可能,在相同事务中进行更新后,将ORM配置为不读取。 最后,在你做完这些之后,如果你碰巧一起使用Spring和Hibernate,你可以加入一个拦截器来监视这种情况。 扩展MethodInterceptor并将其放置在您的Spring bean下的interceptorNames中。 当拦截器运行时,使用invocation.proceed()来执行事务。 捕获任何异常,并定义您想要重试的次数。
o / r映射器无法检测到这一点,因为DBMS中总是发生死锁,这可能是由其他线程或其他应用程序设置的锁造成的。
为了确保一段代码不会造成死锁,请始终使用以下规则: - 在事务之外进行提取。 因此,首先获取,然后执行处理,然后执行DML语句(如插入,删除和更新) - 包含/使用事务的方法或一系列方法中的每个操作都必须使用与数据库相同的连接。 这是必需的,因为例如通过在相同连接上执行的语句来忽略写入锁定(就像同一个连接设置锁定一样))。
通常会发生死锁,因为任何代码都会在事务内部提取数据,导致NEW连接打开(必须等待锁定)或对事务中的语句使用不同的连接。
链接地址: http://www.djcxy.com/p/42387.html上一篇: ORM Support for Handling Deadlocks
下一篇: Are there any open source cross platform NAT punch throughs?