2017-01-30 38 views
0

我有一个用户表,其中每个用户生成一个交易参考号并每次更新1以获取下一个要使用的交易参考号。如何避免经常更新的表上的死锁

表与此类似:

用户名VARCHAR(50), 计数器INT

例如用户名:约翰有一个计数器数1 如果他拿起一个参考号码他的柜台号码是更新为2 ,以便他下次使用2作为参考编号。

的问题是,因为很多用户使用这个表。结果我得到了很多dealocks。任何人都可以请指教。 Thx

+0

看一看:https://dev.mysql.com/doc/refman/5.7/en/innodb-deadlocks.html –

回答

0

建议为COUNTER列创建一个包含AUTO_INCREMENT的新表,并插入任何想要获得新COUNTER的人。该AUTO_INCREMENT负责分配新递增的编号,以新行的,你可以得到一个正常select查询分配给任何特定的人的最新数字。

+0

THX斯里里,但我喜欢在桌子200个用户,每个用户创建每天至少有300个参考号码。按照你的建议,将会创建大尺寸数据的表格,因为这意味着每天我会在这个新表格中插入60000行。 – user3540098

0

简短的回答:你不能防止死锁。

为什么?只是因为你的系统设计工作。我还要举:

我有每个用户生成交易 参考号和更新1每次获得下一交易 参考号码用户的表使用

让我们假设你只有2个用户。每个用户同时发出一个查询。现在,发生的情况是每个用户都使用数据快照进行操作。因此,他们都会计算,例如,下一个交易号码是2

因此,处理连接的两个线程将争夺一个锁并最终陷入死锁。为了解决这个问题,MySQL杀死了一个线程,让其他线程完成。他们为什么要争夺锁定?他们正在寻找了同一个表/计数器/不管它是什么,为了得到正确的信息,该信息不能随意由任何人或任何修改。你很可能不希望每个人都得到相同的事务编号(实际上是线程),所以MySQL在执行计数递增时在表上放置一个锁。

问题的根源在于您试图获取事务的下一个数字,而多个人(实际上是线程)最终会查找相同的来源以获取该数字。

你没有太多的选择在这里,在这里,他们是:

  • 通过重新发行交易处理死锁,一旦MySQL的告诉你有一直陷入僵局。这是如何完成的。死锁不是你应该担心的,它只是数据库告诉你的一种方式,为了保持数据的完整性,它拒绝一个线程来完成它的工作。

  • 重新设计你的系统让你不靠什么下一交易数量会。这部分可能更难,我们不知道依赖于这个功能,但是 - 这将是您最好的选择。我不知道是否有可能,所以我建议你考虑如果你不依赖下一个交易编号,你将如何让你的系统工作。