0

考虑这些表:

CREATE TABLE Status (current_partition INT) -- has a single row
CREATE TABLE RecordedValues (partition INT, value INT)

假设有多个客户端经常使用 插入到RecordedValues表中current_partition,例如:

DECLARE @current_partition INT
SET @current_partition = (SELECT TOP 1 current_partition FROM Status)
INSERT RecordedValues VALUES (@current_partition, 132)

同时,有一个客户端(定期)修改current_partition,然后使用旧分区值读取所有值,例如:

DECLARE @old_partition INT
SET @old_partition = (UPDATE Status 
    SET current_partition += 1 
    OUTPUT deleted.*)
--
SELECT * FROM RecordedValues WHERE partition = @old_partition

如何确保后一个客户端真正选择具有旧分区值的所有行?换句话说,我需要确保在 SELECT 返回后不会提交任何 INSERT。

4

1 回答 1

2

在事务中运行您的命令,并将隔离级别设置为 REPEATABLE READ:

BEGIN TRANSACTION

SET TRANSACTION ISOLATION LEVEL REPEATABLE READ

DECLARE @old_partition INT
SET @old_partition = (UPDATE Status 
    SET current_partition += 1 
    OUTPUT deleted.*)
--
SELECT * FROM RecordedValues WHERE partition = @old_partition

COMMIT TRANSACTION

这将确保事务中语句之间的一致性。

引用文档:

“指定语句不能读取已被其他事务修改但尚未提交的数据,并且在当前事务完成之前没有其他事务可以修改当前事务已读取的数据。”

于 2012-09-09T15:28:34.857 回答