gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 00:27:06 25 4
gpt4 key购买 nike

我正在编写一个同步器软件,它将获取一个数据库中的所有更改并将它们同步到另一个数据库。为此,我在表 T 中添加了两列:

alter table T add LastUpdate rowversion, LastSync binary(8) not null default 0

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

select * from T where LastUpdate > LastSync

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

update T set LastSync=@@DBTS+1 where ID=@syncedId

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

最佳答案

将“LastSync”存储在与真实数据相同的表中可能根本不是一个好主意。尝试将其存储在另一个没有行版本的表中。这样您就可以避免“更新行也会更新时间戳”的问题。

您的同步器软件可以这样工作:

  • 从附加表中获取@LastSync 值
  • “从 T 中选择 @ThisSync = max(LastUpdate),其中 LastUpdate > @LastSync”
  • “Select * from T where LastUpdate > @LastSync and LastUpdate <= @ThisSync”是要同步的行
  • 将 @ThisSync 存储为附加表中的新“LastSync”。

同步运行时修改的条目将具有比 max() 查询更高的 rowversion 值。它们将在下次调用同步器时同步。

关于sql-server - 此 UPDATE 语句中是否存在可能的竞争条件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3996146/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com