多次更新时的T-SQL隔离

时间:2013-04-16 16:35:33

标签: tsql isolation-level

我需要更新一些具有不同值的条目,并在每次更新时进行1次查询。

在此之前,我会检查每个初始值,以确保可以更新条目。

我甚至不确定会发生这种情况,但我希望避免在我进行检查后通过其他查询更改这些条目。

这是我想要避免的一个例子

1)query1检查初始值

2)query2检查初始值

3)query1应用更新

4)query2应用更新

我听说隔离级别,但无法弄清楚如何使用它来避免这个问题,你能帮帮我吗?

提前感谢您的帮助

2 个答案:

答案 0 :(得分:1)

我想知道为什么你不仅仅使用原子UPDATE来对WHERE部分进行必要的检查,然后再进行更新呢?

无论如何,如果你需要使用Select然后更新: 我将你推荐给非常好的文章:http://samsaffron.com/blog/archive/2007/04/04/14.aspx

交易是必要的,以避免脏读等。但另一件你应该注意的是DEADLOCK。在分布式方法中,如果您不使用UPDLOCK(锁定资源以进行进一步更新),您可以更新您阅读的不同数据。

答案 1 :(得分:0)

使用交易。

SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;
GO
BEGIN TRANSACTION;

--check stuff

--update stuff

COMMIT TRANSACTION;

REPEATABLE READ将确保您读取的所有内容(选择)保持不变,直到您的代码到达提交事务。没有人可以更改您已阅读的记录。 有关交易和隔离级别的更多信息,请访问:SET TRANSACTION ISOLATION LEVEL