2013-07-20 150 views
-1

我們正在使用帶有SQL的WPF/C#創建客戶端服務器應用程序。在這裏,我們生成一個唯一的數字b檢查數據庫(獲取最後一個最大數量),並使用該最大值,我們增加'1'並將數值存儲在數據庫中。此時另一位用戶也在同一屏幕上工作並創建唯一號碼,在某些情況下,唯一號碼會被複制並引發異常。併發問題

我們發現這是一個併發問題。

+0

您使用的是什麼RDBMS?你還會介意發佈一些代碼來更好地說明你的方法嗎? – BayStallion

+0

客戶端是如何生成一個數字總是?,並且這個數字總是保存在同一張表中的數據庫? – Joseph

+0

一般的想法是這個生成過程應該在服務器上而不是在客戶端上實現。爲了給你一個更詳細的解釋,我需要知道你至少使用了哪個數據庫系統 – BayStallion

回答

-1

最後,我們將Singleton模式與鎖一起解決此問題。

謝謝。

+0

這不會以任何方式回答這個問題。請發佈更完整的答案,詳細說明您爲解決問題所採取的步驟,否則此答案和可能的問題對未來的訪問者沒有多大價值。 –

0

事實上,獲取一個數字,添加一個數字,並希望它仍然沒有被使用是一個線程競爭和多個客戶端之間的競賽 - 應該避免。

選項:

  • 使用數據庫中的標識列,並讓INSERT過程中的數據庫中生成該值本身;數據庫服務器知道如何安全可靠地執行此操作如果不可能,您可能需要延遲此代碼,直到準備好INSERT,因此它全部是單個數據庫操作的一部分 - 即使如此,如果不可能它不在「可序列化的事務」(使用鍵範圍讀取鎖等)中,那麼你將不得不循環「獲取最大值,增量,嘗試插入但注意我們可能會失去一個種族,所以只有如果該值不存在,則插入 - 如果不成功,可以從開始重複「
  • 或者,您可以在首次需要該號碼時創建新記錄(即使其餘數據不可用),注意你可能仍然需要「循環直到成功」的方法

坦率地說,IDENTITY列方法是最簡單的。