Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何确保更新后仅使用新值_Sql_Sql Server - Fatal编程技术网

Sql 如何确保更新后仅使用新值

Sql 如何确保更新后仅使用新值,sql,sql-server,Sql,Sql Server,考虑到这些表格: CREATE TABLE Status (current_partition INT) -- has a single row CREATE TABLE RecordedValues (partition INT, value INT) 假设有多个客户端经常使用current\u分区插入RecordedValues表,例如: DECLARE @current_partition INT SET @current_partition = (SELECT TOP 1 curren

考虑到这些表格:

CREATE TABLE Status (current_partition INT) -- has a single row
CREATE TABLE RecordedValues (partition INT, value INT)
假设有多个客户端经常使用
current\u分区插入
RecordedValues
表,例如:

DECLARE @current_partition INT
SET @current_partition = (SELECT TOP 1 current_partition FROM Status)
INSERT RecordedValues VALUES (@current_partition, 132)
同时,有一个客户端(定期)修改当前分区,然后用旧分区值读取所有值,例如:

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

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

在事务中运行命令,并将隔离级别设置为可重复读取:

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
这将确保事务中语句之间的一致性

引用文件:


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

如果我理解正确,在SELECT之前提交事务就足够了,可能是正确的-只需在数据库的特定时间点包装所有要执行的语句。在该事务@ErenErsönmez中,您观察到的数据不会发生其他更改