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


有一张表,如 有三列 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 ? 请大家给解释一下!

mysql 索引

被诅咒的小狐狸 12 years, 3 months ago

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

我爱明日香 answered 12 years, 3 months ago

Your Answer