例如,我們有一個表(登錄,哈希)。我們在登錄列上沒有unique
約束,但我們應該保持它的唯一性(例如)。 當新用戶註冊時,我們檢查輸入的登錄是否空閒。 如果這是一個部署到Tomcat的Java Web應用程序,它具有線程池,那麼這些檢查可能會並行處理,對吧?如何確保獨特性呢?沒有數據庫約束的獨特檢查
0
A
回答
1
您可以在表中使用悲觀鎖,這將鎖定表,並且您可以檢查是否存在,因此其他線程暫時無法更改該表。但我認爲這是一種非常糟糕的做事方式,爲什麼不使用數據庫約束?
1
簡而言之,在這裏沒有數據庫限制的情況下,你不能有一個好的解決方案。
在多線程環境中沒有約束條件,您需要一些公共資源來同步您的線程。一個線程會獲取互斥鎖,檢查登錄是否空閒(使用SELECT
),然後INSERT
是空閒的新記錄。沒有其他線程應該能夠同時做到這一點 - 這就是爲什麼你需要在這裏同步。
如果您的所有線程都可以訪問此互斥鎖,並且確保沒有其他人可以同時訪問數據庫,那麼這將起作用。
如果您有幾臺訪問相同數據庫的機器,則會出現第一個問題。在不同機器上運行的線程將無法訪問相同的互斥鎖,因此他們會很高興地並行插入表中。
另一個問題是,如果某人直接登錄到數據庫並直接在該表中創建記錄,那麼這種插入可能恰好發生在您的代碼執行的SELECT和INSERT之間。所以代碼中的同步在這裏沒有幫助。
另一種選擇是鎖定整個表格,但情況更糟。你需要非常可靠地釋放鎖定,否則你會冒着拖延整個系統的風險。
相關問題
- 1. ENUM for SQL Server沒有檢查約束?
- 2. 檢查約束
- 3. 檢查約束
- 4. 檢查約束
- 5. 檢查約束
- 6. 檢查約束
- 7. 檢查約束
- 8. Oracle檢查約束
- 9. PostgreSQL檢查約束
- 10. SQL約束檢查
- 11. Oracle檢查約束
- 12. 檢查sql約束
- 13. 在對數字的最大獨特性有輕微的約束
- 14. 邏輯:數據庫或應用程序/ 2(約束檢查)
- 15. ORM和數據庫約束
- 16. 數據庫外鍵約束
- 17. sql數據庫oracle約束
- 18. phpmyadmin沒有導入數據庫的約束條件
- 19. Django高效bulk_create與獨特的約束
- 20. FOSUserBundle獨特的實體約束
- 21. NHibernate的獨特約束條件
- 22. SQL Server的檢查約束
- 23. 檢查約束的條件
- 24. Condidate的檢查約束
- 25. 將sql server約束檢查限制爲只有新數據
- 26. PDO沒有約束力,PostgreSQL的查詢
- 27. 沒有數據庫的PHP獨特訪問者數量
- 28. SQL - 如何應用「半獨特」約束?
- 29. 如何在沒有約束檢查的情況下刪除表
- 30. 解析SQL檢查約束