在高度并发的Rails系统中处理瞬态数据库错误的“最佳实践”是什么?
在研究死锁问题时,我发现了以下post:
https://rails.lighthouseapp.com/projects/8994/tickets/6596
它的要点如下:
-
MySQL文档说:
死锁是事务数据库中的一个典型问题,但它们并不危险,除非它们如此频繁以至于根本无法运行某些事务。 通常, 您必须编写应用程序,以便在由于死锁而回滚时,它们始终准备重新发出事务 。
-
因此,调试瞬态死锁是一种反模式,因为MySQL认为它们是可行且不可避免的。
-
因此,Rails应该为我们提供一种方法,因为它:
假设存在“最佳”的做事方式,并且它旨在鼓励这种方式
-
但是Rails并没有为我们提供一种方式,所以我们使用的是一种hacky DIY的东西。
所以如果所有这些都是真的,那么Rails解决方案在哪里?
注意:此项目处于非活动状态,但似乎很简单,可以作为解决方案。 为什么Rails没有这样的东西? https://github.com/qertoip/transaction_retry
对我来说,修复是一个更好的索引。
有问题的更新是在带有连接的查询中,现有的索引不足以让MySQL有效地加入和搜索。
即使在具有不合理并发负载的测试中,添加适当的索引也完全消除了死锁问题。