我不知道有什么特殊的 ORM 工具支持自动重新运行因死锁而失败的事务。然而,我不认为 ORM 使得处理锁定/死锁问题有很大不同。首先,您应该分析死锁的根本原因,然后以避免或至少减少死锁的方式重新设计事务和查询。有很多改进选项,例如为事务(部分)选择正确的隔离级别、使用锁定提示等。这更多地取决于您的数据库系统,而不是 ORM。当然,如果您的 ORM 允许您使用存储过程来执行某些微调命令等,这会有所帮助。
如果这不能帮助完全避免死锁,或者您现在没有时间实施和测试真正的修复,当然您可以简单地在保存/提交/持久或任何调用周围放置一个 try/catch,请检查如果异常表明失败的事务是“死锁受害者”,则捕获异常,然后在休眠几秒钟后简单地调用保存/提交/持久。等待几秒钟是一个好主意,因为死锁通常表明存在竞争相同资源的事务的临时高峰,并且一次又一次快速地重新运行相同的事务可能会使情况变得更糟。
出于同样的原因,您可能不会确保只尝试一次重新运行同一事务。
在现实世界中,我们曾经实施过这种解决方法,大约 80% 的“死锁受害者”在第二次成功。但我强烈建议深入挖掘以解决死锁的实际原因,因为这些问题通常随着用户数量呈指数级增长。希望有帮助。
| 归档时间: |
|
| 查看次数: |
2133 次 |
| 最近记录: |