死锁???

两个存储过程 :

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不会发生死锁,不知道为啥


首页 我的博客
粤ICP备17103704号