死锁sql

这样的语句会发生死锁哟:
CREATE TABLE Lock1(C1 int default(0));
--查询一:
BEGIN TRAN  
INSERT INTO Lock1 VALUES(10)    
WAITFOR DELAY '00:00:05'  
SELECT * FROM Lock1 WHERE C1 = 10
COMMIT TRAN

--查询二:(这个语句要与上一个查询不在同一个查询窗口中)
BEGIN TRAN  
INSERT INTO Lock1 VALUES(20)    
WAITFOR DELAY '00:00:04'  
SELECT * FROM Lock1 WHERE C1 = 20 
COMMIT TRAN

解释一下,为什么会发生死锁:
这就好比两个人(A,B两人)分别去运行这两个语句(前后不要超过1S钟),这就相当于并发了。A运行了查询一后,在等待的时间内,B运行了查询二,A,B执行完插入语句后都进入等待时间,这时A,B两人都获取了对Lock1的排它锁(不懂的自己去查),当运行到后面的查询语句时,A,B都请求获取Lock1表的共享锁,但A要想获取Lock1的共享锁,就必须等待B的排它锁释放,而B要想获取Lock1的共享锁,也必须等待A的排它锁释放,所以两个人互相请求,而两个又都不会自动释放,所以就会发生无限期的请求,即死锁。

你可能感兴趣的:(sql)