如何在读取时阻止记录?

时间:2013-11-18 19:29:47

标签: sql-server transactions isolation-level

在我的情况下,我有一组记录,当我更新其中一个时,我需要更新该组的其余记录。因此,为了确保我更新所有这些,我需要确保在更新组的一条记录时没有其他记录添加到组中。另外,我需要确保在进程中间不删除组的记录,因为那时我更新了一个真正不属于该组的记录。

所以我正在考虑在阅读时阻止记录的可能性。 In the documenation我看到更严格的隔离是可序列化隔离,但我有一个疑问,因为它说:

  

语句无法读取已修改但尚未由其他事务提交的数据。

如果记录被修改但未提交,则其他语句无法读取记录,但如果仍然没有被修改则可以读取,因此我可以获得未更新的信息,我需要确定需要更新的相关记录。

所以我想知道它是否是另一种在读取时阻止记录的方法。我知道有了提示,我可以在执行语句时阻塞表,但阻止所有表。我需要执行它的过程非常快,但我想避免需要阻塞所有表并仅阻止我需要的记录。

2 个答案:

答案 0 :(得分:1)

操作多视图并发控制(MVCC)需谨慎处理。是的,SERIALIZABLE是一把双刃剑,可以让你陷入困境。但是,这是您引用的文档中的关键点:

  

其他事务无法插入具有键值的新行   落在当前任何语句读取的键范围内   交易直到当前交易完成。

听起来保护键范围真的是你想做的事情,序列化是唯一有点理智的方式(我知道)。

所以,你在SERIALIZABLE的正确轨道上。请小心,彻底测试,并使您的交易快速完成

答案 1 :(得分:1)

是的,您可以使用SERIALIZABLE隔离级别。在您链接的文档的下一个点,它说:

  

在当前事务完成之前,没有其他事务可以修改当前事务已读取的数据。

     

其他事务无法插入新行,其键值将落在当前事务中任何语句读取的键范围内,直到当前事务完成为止。

您需要的是什么。

请记住,您可以更改隔离级别。您可以将其提升到SERIALIZABLE以完成工作,然后将其移回到之前的状态。当隔离级别为SERIALIZABLE时,锁定就会保留到位,直到事务结束。