先创建一个表
CREATE TABLE Table1
(
ID INT IDENTITY(1,1),
x INT,
y INT
)
然后打开两个查询分析器,同时执行下面的语句SET NOCOUNT ON
DECLARE @x INT
SET @x = 0
WHILE @x < 1000000
BEGIN
BEGIN TRANSACTION
UPDATE Table1 SET x = @x WHERE y = @x
IF @@ROWCOUNT = 0
BEGIN
INSERT INTO Table1 (x, y) VALUES (@x, @x)
END
UPDATE Table1 SET x = @x + 1 WHERE y = @x
COMMIT TRANSACTION
SET @x = @x + 1
END
SET NOCOUNT OFF结果会报告死锁。
如果将这一句:UPDATE Table1 SET x = @x + 1 WHERE y = @x
去掉就不会有问题。
这里很奇怪UPDATE和INSERT所获得的所都是排他的,从我以前的知识了解来看,UPDATE是U锁,INSERT是X锁,但是U锁本身也是排斥的,因此这里应当是不会死锁的。即使是从INSERT到UPDATE也应该不会出现任何的问题才对啊。