MySQL-MySQL多个非聚集索引 导致死锁

发布于 2016-11-09 07:41:10 字数 702 浏览 1054 评论 2

有一张表,如 有三列 t(id,age,vote), ID为主键,在age 与 vote上都加上非聚集索引,那么有两个查询T1,T2.
T1: select * from t where age>30 for update.
T2: select * from t where vote>60 for update.

根据mysql 锁的算法,两个事务会试锁lock一些row. 问题来了,那比如T1 已经取得7,5行,等待第6行,那T2已经取得第6行,等待第5行,这时会发生死锁!死锁的发生是因为没有按照一样的顺序去给行加锁....

根据官方文档," Access your tables and rows in a fixed order. Then transactions form well-defined queues and do not deadlock."
1. 避免这种情况,应该按照同样的顺序,是不是要在select语句后面要加一个order by id?
2. 加上一个order by,会不会导致额外的操作?如果主索引是基于B+树,那按顺序读取应该很快,不过文档上说用B-树B- Tree? 请大家给解释一下!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

归属感 2017-07-23 03:50:43

你这个问题是怎样处理变发的吧,你看这样行不行,自己写一个锁表的函数.加一个锁表C,专门用来锁A表的的行,T1从A表里读取数据的时候,将数据存储到C表中,如果C表里已经将T2,或者T3,T4,T5...要读取的数据锁住了,那么,T2,T3,T4,T5...都不能读取此条数据,最后在锁表函数的结尾加一个1秒或者3秒之后强制解锁的.这样,应该就不会死锁了,当然,如果你的MYSQL数据库出问题了,那是另说.而且,这样做的好处就是你也不用考虑什么非聚集索引了.比较傻瓜化的东西

想挽留 2017-04-12 07:57:02

不会死锁,select for update 只是尝试加锁,也就是意向排他锁IX。要么全hold,要不一个也不hold,不会造成死锁的

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文