我需要更新一些具有不同值的条目,并在每次更新时进行 1 次查询。
在此之前,我会检查每个初始值以确保可以更新条目。
我什至不确定这是否会发生,但我想避免在我进行检查后让这些条目被另一个查询更改。
这是我要避免的示例
1) query1 检查初始值
2) query2 检查初始值
3) query1 应用更新
4) query2 应用更新
我听说过隔离级别,但不知道如何使用它来避免问题,你能帮我吗?
预先感谢您的帮助
我需要更新一些具有不同值的条目,并在每次更新时进行 1 次查询。
在此之前,我会检查每个初始值以确保可以更新条目。
我什至不确定这是否会发生,但我想避免在我进行检查后让这些条目被另一个查询更改。
这是我要避免的示例
1) query1 检查初始值
2) query2 检查初始值
3) query1 应用更新
4) query2 应用更新
我听说过隔离级别,但不知道如何使用它来避免问题,你能帮我吗?
预先感谢您的帮助
我想知道为什么您不只是使用原子更新在 WHERE 部分进行必要的检查,然后为此进行更新?
无论如何,如果您需要使用 Select 然后更新:我将您推荐给非常好的文章:http ://samsaffron.com/blog/archive/2007/04/04/14.aspx
事务对于避免脏读等是必要的。但是您应该注意的另一件事是死锁。在分布式方法中,如果您不使用 UPDLOCK(锁定资源以进行进一步更新),您可以更新您读取的不同数据。
使用事务。
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;
GO
BEGIN TRANSACTION;
--check stuff
--update stuff
COMMIT TRANSACTION;
REPEATABLE READ 将确保您读取(选择)的所有内容都将保持不变,直到您的代码到达提交事务。没有人可以更改您已阅读的记录。此处有关事务和隔离级别的更多信息:SET TRANSACTION ISOLATION LEVEL