回答
他們都沒有得到「優先」。當您談論非原子操作時,這不再是一個有用的術語。一個例子將在這裏說明這個問題。
這是你的腳本如下:
- 從數據庫中讀取值。
- 遞增1.
- 將新值寫入數據庫。
這適用於一次只有一個人使用數據庫的情況。如果有多人蔘與,事情就不會起作用。以下是現在發生的事情:
- DB中的原始值是「100」。
- 客戶端A讀取「100」。
- 客戶端A本地增加「100」到「101」,但尚未寫入。
- 客戶端B讀取「100」。
- 客戶端B在本地增加「100」到「101」,但尚未寫入。
- 客戶端A寫入「101」。
- 客戶端B寫入「101」。
這就是所謂的競態條件,這是因爲你沒有使用transaction。通過交易,以下是可能發生的情況:
- DB中的原始值爲「100」。
- 客戶端A以此值開始交易。
- 客戶端A讀取「100」。
- 客戶端A本地增加「100」到「101」,但尚未寫入。
- 客戶端B嘗試開始一個事務,但已經有一個掛起的事務,所以它還不能啓動。
- 客戶端A寫入「101」。
- 客戶端A關閉交易並實際寫入值。
- 客戶端B以此值開始交易。
- 客戶端B讀取「101」。
- 客戶端B本地增加「101」到「102」,但尚未寫入。
- 客戶端B寫入「102」。
- 客戶端B關閉事務並且實際寫入值。
感謝您的幫助,我可以得到怎樣,如果你想找到交易(提交/回滾)信息使用事務在訪問 – Gali
閱讀該死的幫助文件樣本。 –
這是一個併發問題:
兩個用戶A和B從數據庫中讀取的當前值。然後A在客戶端增加它並將其寫回數據庫,但B已經讀取了該值並且不知道遞增的值。與之前的A相同,B增加值並將其寫回,並用相同的數字覆蓋A的變化。
這種獨特的數代的是不是安全。您應該讓數據庫通過使用自動增量值來執行增量操作。
或者你可以有下面的結構:
- 創建一個額外的ID表。
- 創建一個存儲過程中,你
- 鎖訪問ID表
- 讀取當前值
- 增量,並將其寫回
- 解鎖訪問
- 返回增加後的值
創建ID表可以防止鎖定您的數據表。
那麼,從你問題中的最後一個問題來看,你看到兩個重複數字記錄的原因是因爲你允許在你的模式/數據庫/表設計中開始。首先在數據庫中添加約束和關係,並且您的方案會拋出一個錯誤,您可以使用開放式客戶端的開放式併發和/或繼續進行數據庫端的唯一密鑰生成和/或使用事務和等等。
這是一個Access經常被問到的問題。如果你在谷歌的「訪問多用戶自定義計數器」,你會得到很多解決方案。
它們通常基於使用表來保存「種子」值,該值僅被編輯,以便一次只有一個用戶可以更改該種子值。可能有其他方法使用Jet/ACE交易,但這種方法要簡單得多。
請注意,來自MS的三個解決方案中的兩個解決方案使用ADO,這在Access中不可取,但可能適用於外部Access。
- 1. 嘗試連接PDO時訪問被拒絕用戶
- 2. 當多個用戶嘗試連接到我的NodeMCU時出現問題
- 3. SQL連接三個表,連接優先
- 4. 訪問被拒絕,當我嘗試連接到MySQL服務器
- 5. android.os.networkNetworkOnMainThreadException當嘗試http連接
- 6. 嘗試訪問會話bean時出錯
- 7. 當試圖使用WebClient訪問它時,網站會切斷連接
- 8. 嘗試連接Google,但有時會出現「連接失敗」
- 9. 訪問每個連接的節點時不會訪問多次
- 10. 當用戶訪問WordPress博客時提供Facebook連接
- 11. 訪問2013嘗試將數據連接到單個表格
- 12. mysqli連接嘗試不同的用戶
- 13. 嘗試連接到2個服務時,Android bindService返回false
- 14. Linq問題當嘗試左多個記錄的連接投影
- 15. 嘗試添加Windows用戶帳戶時訪問被拒絕
- 16. 使php頁面無法訪問,當用戶想要嘗試
- 17. 嘗試使用UDL文件連接到訪問
- 18. C#:檢查用戶是否有權訪問服務器沒有嘗試連接
- 19. 您可以訪問用戶嘗試連接到的ip地址嗎?
- 20. Oracle連接優先級
- 21. HA Proxy優先連接
- 22. 嘗試訪問MdTabBody在角材料2
- 23. Sails.js,MongoDb:嘗試連接時超時;可能使用連接池?
- 24. symfony2調試:當訪問其他防火牆後面的路由時,用戶會斷開連接
- 25. 當客戶端嘗試重新建立連接時,g_io_channel_unix_new()調用SIGSEGV的結果
- 26. 當多個用戶訪問YII時,會話值被覆蓋
- 27. CRMServiceClient不會嘗試連接到Dynamics CRM
- 28. 在嘗試從訪問數據庫獲取連接時掛起應用程序
- 29. javax.mail.MessagingException:在嘗試使用java郵件API訪問Gmail時重置連接
- 30. 當用戶訪問.net應用程序時,出現連接超時錯誤
我假設你在談論一個MS Access數據庫? – CodesInChaos
我假設你的三個操作的組合不是原子的。使用事務是古典的解決方案,但我不確定訪問是否支持這一點。因此,假設每個用戶都在同一臺機器上運行,您可以在C#中使用鎖定來獲得原子性。 – CodesInChaos