两个存储过程 :
BEGIN START TRANSACTION; if EXISTS (SELECT name from manydate where id=1) THEN SELECT SLEEP(3);##等待了3秒 UPDATE manydate SET `name`="haha" WHERE id = 1; END IF; COMMIT; END
BEGIN UPDATE manydate SET `name` = 'caca' WHERE id = 1; END
先执行第一个,再执行第二个时,第二个就会报死锁。
首先执行第一个存储过程第一条Select时给予id=1添加了读锁,第二个存储过程Update需要给id=1添加写锁,但是因为前面加了读锁,等待。等待3秒,执行第一个存储过程的第二条Update,需要升级id=1读锁为写锁,但是前面有在排队请求的id=1的写锁,不能升级,等待,这样就死锁了。
第一个不用开启事务,不会发生死锁;不用IF EXISTS不会发生死锁,不知道为啥