此UPDATE语句中是否存在可能的竞争条件?

Vil*_*lx- 5 sql-server timestamp rowversion race-condition database-concurrency

我正在编写一个同步软件,它将在一个DB中进行所有更改并将它们同步到另一个DB.为此我在表格中添加了T两列:

alter table T add LastUpdate rowversion, LastSync binary(8) not null default 0
Run Code Online (Sandbox Code Playgroud)

现在,我可以轻松选择自上次同步以来已更改的所有行:

select * from T where LastUpdate > LastSync
Run Code Online (Sandbox Code Playgroud)

但是在执行同步之后,我应该使两个字段相等.但是更新行也会更新时间戳,所以我必须这样做:

update T set LastSync=@@DBTS+1 where ID=@syncedId
Run Code Online (Sandbox Code Playgroud)

但我想知道 - 这总是有效吗?如果我读取了值,@@DBTS然后另一个用户设法在我的行提交之前的某个地方插入/更新一行,该怎么办?这是冒险的代码吗?如果是的话 - 它怎么能变得更好?

cjk*_*cjk -1

如果您在Serializable事务中运行此操作,则其他读/写操作将无法影响这些表。

RepeateableRead也可以做这个工作...