详解MySQL中的死锁情况以及对死锁的处理方法

2019-01-04 16:43:13刘景俊

添加精心选定的索引到你的表。则你的查询需要扫描更少的索引记录并且因此设置更少的锁定。使用EXPLAIN SELECT来确定对于你的查询,MySQL认为哪个索引是最适当的。

使用更少的锁定。如果你可以接受允许一个SELECT从一个旧的快照返回数据,不要给它添加FOR UPDATE或LOCK IN SHARE MODE子句。这里使用READ COMMITTED隔离级别是比较好的,因为每个在同一事务里的持续读从它自己新鲜的快照里读取。

如果没有别的有帮助的了,用表级锁定系列化你的事务。用LOCK TABLES对事务型表(如InnoDB)的正确方法是设置AUTOCOMMIT = 0 并且不调用UNLOCK TABLES直到你明确地提交了事务。例如,如果你需要写表t1并从表t读,你可以按如下做:

SET AUTOCOMMIT=0; LOCK TABLES t1 WRITE, t2 READ, ...; [do something with tables t1 and t2 here]; COMMIT; UNLOCK TABLES;

表级锁定使得你的事务很好地排队,并且死锁被避免了。

领一个系列化事务的方法是创建一个辅助的“semaphore” 表,它只包含一个单行。让每个事务在访问其它表之前更新那个行。以这种方式,所有事务以序列的方式发生。注意,InnoDB即时死锁检测算法也能在这种情况下起租用,因为系列化锁定是行级锁定。超时方法,用MySQL表级锁定,必须被用来解决死锁。

在应用程序中使用LOCK TABLES命令,如果AUTOCOMMIT=1,MySQL不设定InnoDB表锁定。

您可能感兴趣的文章:

mysql锁表和解锁语句分享MySQL行级锁、表级锁、页级锁详细介绍通过mysql show processlist 命令检查mysql锁的方法MySQL Innodb表导致死锁日志情况分析与归纳Mysql数据库锁定机制详细介绍MYSQL锁表问题的解决方法一次Mysql死锁排查过程的全纪录mysql 数据库死锁原因及解决办法mysql数据库锁的产生原因及解决办法MySQL死锁问题分析及解决方法实例详解mysql 锁表锁行语句分享(MySQL事务处理)MySQL中Innodb的事务隔离级别和锁的关系的讲解教程Mysql(MyISAM)的读写互斥锁问题的解决方法mysql锁定单个表的方法查找MySQL线程中死锁的ID的方法Mysql使用kill命令解决死锁问题(杀死某条正在执行的sql语句)Mysql 数据库死锁过程分析(select for update)MySQL锁(表锁,行锁,共享锁,排它锁,间隙锁)使用详解