点击关注上方“SQL数据库开发”,
设为“置顶或星标”,第一时间送达干货
导读:虽然锁在一定程度上能够解决并发问题,但稍有不慎,就可能造成死锁。本文介绍死锁的产生及处理。



预防死锁:处理死锁最直接的方法就是破坏造成死锁的4个必要条件中的一个或多个,以防止死锁的发生。 避免死锁:在系统资源的分配过程中,使用某种策略或者方法防止系统进入不安全状态,从而避免死锁的发生。 检测死锁:这种方法允许系统在运行过程中发生死锁,但是能够检测死锁的发生,并采取适当的措施清除死锁。 解除死锁:当检测出死锁后,采用适当的策略和方法将进程从死锁状态解脱出来。
mysql> set session transaction isolation level repeatable read;
Query OK, 0 rows affected (0.00 sec)
mysql> start transaction;
Query OK, 0 rows affected (0.00 sec)
mysql> select * from account where id =1 for update;
+----+--------+---------+
| id | name | balance |
+----+--------+---------+
| 1 | 张三 | 300 |
+----+--------+---------+
1 row in set (0.00 sec)
mysql> set session transaction isolation level repeatable read;
Query OK, 0 rows affected (0.00 sec)
mysql> start transaction;
Query OK, 0 rows affected (0.00 sec)
mysql> select * from account where id =2 for update;
+----+--------+---------+
| id | name | balance |
+----+--------+---------+
| 2 | 李四 | 350 |
+----+--------+---------+
1 row in set (0.00 sec)
mysql> select * from account where id =2 for update;
mysql> select * from account where id =1 for update;
ERROR 1213 (40001): Deadlock found when trying to get lock; try restarting transaction
show engine innodb status\G
尽量让数据表中的数据检索都通过索引来完成,避免无效索引导致行锁升级为表锁。 合理设计索引,尽量缩小锁的范围。 尽量减少查询条件的范围,尽量避免间隙锁或缩小间隙锁的范围。 尽量控制事务的大小,减少一次事务锁定的资源数量,缩短锁定资源的时间。 如果一条SQL语句涉及事务加锁操作,则尽量将其放在整个事务的最后执行。 尽可能使用低级别的事务隔离机制。

文章转载自SQL数据库开发,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




