【发布时间】:2011-12-10 12:49:42
【问题描述】:
我有一个执行更新的 SQL 语句,然后如果 @@ROWCOUNT 为 0,它将插入。这基本上是 SQL 2008 中的MERGE。我们遇到了两个线程同时更新失败的情况。它将尝试在表中两次插入相同的键。我们使用的是默认事务隔离级别,已提交读。将级别更改为可重复读取会解决此问题,还是我必须一直到 Serializable 才能使这项工作?这是一些代码:
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;
BEGIN TRAN;
UPDATE TableA
SET Duration = @duration
WHERE keyA = @ID
AND keyB = @IDB;
IF @@rowcount = 0
BEGIN
INSERT INTO TableA (keyA,keyB,Duration)
VALUES (@ID,@IDB,@duration);
END
COMMIT TRAN;
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;";
【问题讨论】:
-
在 Read Committed Transaction Isolation 级别不会出现脏读。您只能通过未提交的读取来获得脏读。
-
抱歉的意思是 - 使更新和插入原子。我如何组合它们
标签: sql-server sql-server-2005 transactions isolation-level