这样的语句会发生死锁哟:
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的排它锁释放,所以两个人互相请求,而两个又都不会自动释放,所以就会发生无限期的请求,即死锁。