1.使用相同索引键值的冲突
由于mysql 的行锁是针对索引加的锁,不是针对记录加的锁,所以虽然是访问不同行的记录,但如果是使用相同的索引键,是会出现锁冲突的。设计时要注意
例如:city表city_id字段有索引,Cityname字段没有索引:
会话1
会话2
SET autocommit=0;
SET autocommit=0;
SELECT * FROM city WHERE city_id=14 AND Cityname='深圳' FOR UPDATE;
city_id country_id cityname CityCode
14 2 深圳 001
会话2与会话1访问的是不同的记录,但是因为使用了相同的索引值,所以需要等待锁
SELECT * FROM city WHERE city_id=14 AND Cityname='长沙' FOR UPDATE;
等待...
2.使用不同索引键值但是同一行的冲突
当表有多个索引时候,不同的事务可以使用不同的索引锁定不同的行,无论什么索引,innodb都会使用行锁来对数据加锁。
例如city表city_id字段有主键索引,CityCode字段有普通索引:
会话1
会话2
SET autocommit=0;
SET autocommit=0;
SELECT * FROM city WHERE city_id=14 FOR UPDATE;
city_id c