死锁的出现
如果是表级锁的情况下是不会出现死锁的,也就是说MyIsam引擎中不会发生死锁,死锁主要出现在InnoDB引擎中使用行级锁的情况。
InnoDB引擎下 出现死锁的关键就是多个session加锁的顺序不一致。
InnoDB下的表级锁
- InnoDB中如果是执行insert语句使用的是表级锁,因此insert操作不会出现死锁问题;
- 如果执行select查询语句没有走主键和辅助索引使用的也是表级锁,这种操作也不会出现死锁问题。
InnoDB下的行级锁
- 基于当前读(for update)的走索引的查询使用的是行级锁,可能会出现死锁;
- 更新操作使用的也是行级锁,可能会出现死锁。
如何有效的避免死锁的出现
如果是更新操作,尽可能把多条行记录的更新使用 in 条件一起更新,这样可以保证并发过程中多个session执行更新时 对多条记录的加锁顺序一致。因为MySQL会把 in 条件中的条件值从小到大排序,加锁时也是挨个从小到大加锁。
在一个事务session中执行
select * from t3 where id in (8,9) for update;
这时候在另一个事务session中执行
select * from t3 where id in (8,5) for update;
这种情况下,第二条SQL执行时 id=5的记录是可以加锁成功的,但是8不可以因为被第一个session加了锁。