【发布时间】:2011-04-29 02:39:12
【问题描述】:
我正在编写一个同步器软件,它将获取一个数据库中的所有更改并将它们同步到另一个数据库。为此,我在表格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 的值,然后另一个用户在我的行被提交之前设法在某处插入/更新了一行怎么办?这是有风险的代码吗?如果是的话 - 怎样才能做得更好?
【问题讨论】:
-
顺便问一下,您使用的是哪个版本的 SQL Server? Change Data Capture 是一个选项吗?
-
@Martin Smith - 2008 年,我想。不确定客户有什么。
-
@Martin Smith - 我检查了变更数据捕获,但那将是矫枉过正。一个简单的时间戳就足够了。我只需要知道哪些记录还需要同步。我不需要完整的历史记录。
标签: sql-server timestamp race-condition rowversion database-concurrency