2010-07-09 78 views
1

c#應用程序。如何確保數據一致性

我正在做一個select,然後更新表中的列。我把它們放在一個單獨的事務中,隔離級別設置爲Serializable。我正在這樣做,以實現數據的一致性。

但我仍然可以檢查多個用戶能夠讀取(選擇)相同的值並最終嘗試使用相同的值進行更新。

任何人都可以建議我如何能實現的一致性,使得

兩個不同的用戶讀取相同的值。
沒有用戶讀取已更新但尚未提交的值。

+0

您可能想要指定您正在使用的關係數據庫系統 - SQL Server,MySQL,Oracle等。 – 2010-07-09 15:57:11

+0

Praveen,尤其如此,因爲您的問題與C#完全沒有關係。 – 2010-07-09 16:00:57

回答

2

如果你想防止這也就是所謂的悲觀鎖。你可以用(Table | Row)鎖來做到這一點,但它會殺死你的表現。

'標準'方式是使用樂觀併發,並在發生後解決問題

沒有兩個用戶讀取相同的值。

您可以(只)通過一次只允許一個連接來確保這一點。

沒有用戶讀取已更新但尚未提交的值。

這隻需要(更輕)ReadCommitted隔離級別。

+0

如何將更新與返回在一個特殊的過程中,並從我的應用程序中調用它。 這會照顧所有問題嗎? – Praveen 2010-07-09 17:37:55

+0

不,存儲過程不會改變問題。 – 2010-07-10 07:55:27

1

有很多不同的方法來實現這一點。您可以在記錄上使用時間戳。當你進行更新時,確保你的應用程序使用記錄匹配匹配的id匹配和時間戳。

爲了避免讓用戶讀取未提交的記錄,請在查詢中使用sql提示。

0

完成任務的一種方法: 您必須在表格中添加一個「鎖定」字段。

然後你應該編寫一個存儲過程,將一些ID作爲參數,自動選擇一個帶有NULL鎖的行,更新該行,以便鎖包含傳入的ID並返回值。

只要存儲過程是以原子方式執行的(其他任何對錶的請求都會等待直到完成),每個調用此過程的客戶端都會獲得另一個仍然具有鎖定字段爲空的值。一旦返回值,客戶端確信包含該值的行將其鎖定字段設置爲某個值,則不會返回該值。

做完修改後,您應該更新行,寫入新值並將鎖定字段設置爲NULL,從而「解鎖」行以備將來的請求使用。

0

如何在更新過程中使用特定的過程返回並從我的應用程序調用它。

這會照顧所有問題嗎?

0

沒有兩個用戶讀取相同的值。

爲此,請在SET TRANSACTION語句中添加RESERVING mytable FOR PROTECTED WRITE(或數據庫上的本地等效項)。

沒有用戶讀取已更新但未提交的值。

如果您使用的是SERIALIZABLE事務,則不會出現此問題。

相關問題