1
我有一个SQL语句做更新,然后如果@@ROWCOUNT
是0,它会插入。这基本上是SQL 2008.中的一个MERGE
。我们遇到两个线程同时失败的情况。它会尝试在表中插入相同的密钥两次。我们正在使用默认事务隔离级别Read Committed。将水平改为可重复读取可以解决这个问题,还是我必须一路走到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;";
您不会因为读取已提交事务隔离级别而进行脏读操作。读取未提交只能获得脏读。 – 2011-10-19 00:43:17
不好意思说 - 做更新和插入原子。我如何结合他们 – Ryan