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然后另一个用户设法在我的行提交之前的某个地方插入/更新一行,该怎么办?这是冒险的代码吗?如果是的话 - 它怎么能变得更好?