考虑这些表:
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。
答案 0 :(得分: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
这将确保您的交易中的报表之间的一致性。
引用文档:
“指定语句无法读取已被修改但尚未由其他事务提交的数据,并且在当前事务完成之前,其他任何事务都无法修改当前事务已读取的数据。”