5

我正在编写一个同步器软件,它将获取一个数据库中的所有更改并将它们同步到另一个数据库。为此,我在表中添加了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然后另一个用户设法在我的行被提交之前在某处插入/更新行怎么办?这是有风险的代码吗?如果是的话 - 它怎么能变得更好?

4

2 回答 2

4

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

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

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

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

于 2010-10-22T11:45:45.400 回答
-1

如果您在Serializable事务中运行它,那么其他读取/写入将无法影响这些表。

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

于 2010-10-22T11:03:37.720 回答