先创建一个表
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也应该不会出现任何的问题才对啊。
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也应该不会出现任何的问题才对啊。
解决方案 »
- sql server2005不能导出数据为insert这种sql文件
- 请问一个关于c/s系统自动更新的问题
- [新手][100分]二表关联,然后合并相同字段的那一列,如何做?
- 急! ! !急! ! !急! ! !求一SQL语句.
- MODIFY FILE 失败。文件 'd:\sql\book.mdf' 不存在
- 相同表结构复制记录
- 为什么这个动态模糊查询总是丢掉了末尾的%'
- 关于主键值更新
- 这个错误"异类查询要求为连接设置 ANSI_NULLS 和 ANSI_WARNINGS 选项。这将确保一致的查询语义。请启用这些选项,然后重新发出查询。"是
- 想取得表中的Master Key的情况
- 麻烦大家,SqlServer的导入视图,自定义函数的问题
- 2005 更改默认安装路径
SET NOCOUNT ON
DECLARE @x INT
SET @x = 0
WHILE @x < 1000000
BEGIN
BEGIN TRANSACTION
INSERT INTO Table1 (x, y) VALUES (@x, @x)
UPDATE Table1 SET x = @x + 1 WHERE y = @x
COMMIT TRANSACTION
SET @x = @x + 1
END
SET NOCOUNT OFF