2010-11-06 28 views
1

如何解決sql server中下面的髒讀問題。髒讀問題,如何在sql server 2005中解決

有一個客戶 發票報告,該報告在下午1:00運行,之後所有發票都發送給相應客戶的 進行付款。讓我們說一個客戶有1000美元的支付。客戶 在凌晨1:00支付1000美元,同時運行報告。其實,客戶沒有錢 待定但仍然發票。

還如何解決這個prblem也爲不可重複讀

例如,一個客戶要預定的航班,所以對於航班可用性旅遊 代理檢查。旅行社找到座位並繼續預訂座位。 當旅行社預訂座位時,其他旅行社預訂座位。當這位旅行社去更新記錄時,他得到錯誤,說「座位已經預訂」。總之, 旅行社在不同的時間得到不同的狀態爲海

也是這個問題還麻煩我.....丟失更新

假設客戶有原因的 2000 $支付。他支付1000美元並再次購買500美元的產品。可以這麼說,這兩筆交易現在是從公司的兩個不同的櫃檯輸入的。現在 計數器用戶在上午10:00同時開始輸入。實際上,在上午10:01, 客戶應該有2000 $ -1000 $ + 500 = 1500 $等待支付。但正如在丟失的更新 中所述,第一個事務不被考慮,第二個事務覆蓋它。所以最終的待決 是2000 $ + 500 $ = 2500 $ .....我希望公司不會鬆動客戶。

回答

3

您正在描述邏輯分離。

在後一種情況下,您需要逐項列明發票並說明客戶是否支付了未付款的東西;通過系統瞭解它是否能夠實現。

在第一個錯誤是簡單地說明顯而易見。它與磁盤訪問和文件句柄的情況相同。僅僅因爲你在檢查時寫了一個文件並不意味着當你嘗試這樣做時你實際上可以寫入一個文件。

您必須處理錯誤。

在第一種情況下,我不明白爲什麼你不能說這些金額正在等待處理。如果發出空的發票確實是一個問題,那麼你需要在發行前正確檢查。如果發票確實沒有任何物品,那麼就會有一些邏輯表示掛在這張發票上沒有明細項目或總數爲零。但如果因爲在發票和收據之間支付了費用,那麼您仍然有一張有效的發票。

如果你正在談論2件事情立即更新記錄,那麼你需要使用一個鎖定系統來確保在另一個寫入發生時沒有其他進程寫入。

這裏有各種併發方法 - 比如semephore系統。 sql本身有事務。 Google SQL的併發性,這是許多解決方案的共同問題。

常見模式是讀取,鎖定,讀取,寫入和解鎖。

Understanding Concurrency Control

要考慮的事情是你想高性能的讀取或寫入。您使用的策略將反映這一點。例如,你正在考慮一個單一的領域......但是如何在單個行上更新多個領域?