我正在寫一個同步軟件,它將在一個數據庫中進行所有更改並將它們同步到另一個數據庫。爲此我已在我的表T
兩列:在這個UPDATE語句中是否有可能的競爭條件?
alter table T add LastUpdate rowversion, LastSync binary(8) not null default 0
現在我可以很容易地選擇自上次同步已更改的所有行:
select * from T where LastUpdate > LastSync
但是執行同步我應該後使兩個領域平等。但更新行也更新時間戳,所以我必須這樣做:
update T set [email protected]@DBTS+1 where [email protected]
但我想知道 - 這將始終工作?如果我讀取@@DBTS
的值,然後另一個用戶在我的行提交之前設法在某處插入/更新行,該怎麼辦?這是有風險的代碼嗎?如果是的話 - 它怎麼會變得更好?
順便問一下SQL Server的版本和版本是什麼?是[更改數據捕獲](http://msdn.microsoft.com/zh-cn/library/bb522489.aspx)選項? – 2010-10-22 11:52:29
@Martin Smith - 2008,我想。不確定客戶有什麼。 – 2010-10-22 13:37:15
@馬丁史密斯 - 我檢查了更改數據捕獲,但這將是一個矯枉過正。一個簡單的時間戳就足夠了。我只需要知道哪些記錄仍然需要同步。我不需要完整的歷史。 – 2010-10-22 14:09:28