mysql InnoDB死锁

MyISAM表锁时deadlock free的,因为MyISAM总是一次获得所需要的全部锁,不会出现死锁。

但InnoDB,除单个SQL组成的事务外,锁是逐步获得的,所以会发生死锁的可能。

session1 session2

select * from table1 where id = 1 for update;

select * from table2 where id = 1 for update;

select * from table2 where id = 1 for update;

因为session2已取得排他锁,等待

 
 

select * from table1 where id = 1 for update;

死锁

 

2个事务都需要获得对方持有的排他锁才能继续完成事务,这种循环锁等待就是常见的死锁。

 

避免死锁常用方法

1、在应用种,如果不同的程序会并发存取多个表,应尽量约定以相同顺序来访问表。

2、在程序以批量方式处理数据的时候,如果事先对数据排序,保证每个线程按固定顺序来处理记录,也可以降低死锁的可能。

3、在事务种,如果要更新记录,应该直接申请足够级别的锁,即排他锁,而不允许申请共享锁,更新时再申请排他锁。

 

你可能感兴趣的:(mysql)