在抖音上看到一个视频,内容就是程序员去面试,题目是请描述一下死锁,如果可以很清楚的描述就可以录用,然后这个程序员说如果你们录用我,我就讲一下死锁,然后就被录用了。当然我们知道这是什么意思。现在想用MySQL来介绍一个死锁的概念。PS:概念很重要
死锁
是指两个或者多个事务在同一资源上相互占用,并请求锁定对方占用的资源,从而导致恶性循环的现象。
如何产生的
当多个事务试图以不同的顺序锁定资源时,就可能会产生死锁。多个事务同时锁定同一个资源时,也会产生死锁。
--- 事务1
START TRANSACTION;
UPDATE StockPrice SET close = 45 WHERE stock_id = 4 and date = '2002-05-01';
UPDATE StockPrice SET close = 19 WHERE stock_id = 3 and date = '2002-05-02';
COMMIT;
--- 事务2
START TRANSACTION;
UPDATE StockPrice SET high = 20 WHERE stock_id = 3 and date = '2002-05-02';
UPDATE StockPrice SET high = 47 WHERE stock_id = 4 and date = '2002-05-01';
COMMIT;
如果凑巧,两个事务都执行了第一条UPDATE
语句,更新了一行数据,同时也锁定了改行数据,接着每个事务都尝试去执行第二条UPDATE
语句,却发现改行已经被对放锁定,然后都等待对方释放锁,然而又同时拥有对方需要的锁,则陷入死循环。