Locking
悲觀鎖定最壞情況
我們正在使用 Java EE,並且正在製作一個應用程序,在最壞的情況下,許多消息隊列消息將來自同一個使用者。
因此,我們正在尋找悲觀、
SELECT FOR UPDATE
風格鎖定。這在理論上和第一次測試解決了我們的問題。然而,我們害怕僵局。不是經典的:使用者 X 鎖定 A,使用者 Y 鎖定而是更多的場景,例如:系統崩潰、網路問題……等等。數據庫系統鎖定,原因不明。我們將使用現代數據庫,例如:Oracle、MS SQL 和 PostgreSQL。
我們想知道的是生產中使用的悲觀鎖,以及會出現哪些實際問題?
提前致謝!
悲觀鎖是一個很好用的好東西。
最重要的是,您的問題都將是並發問題,而乾擾並發的事物將乾擾性能。例如,如果您的網路交換機開始隨機丟棄 10% 的數據包,這將使網路連接花費更長的時間,並且您的鎖會受到影響。這些本身不會是死鎖,只會使在最好的情況下會很痛苦的問題變得更糟。
系統崩潰不應導致死鎖。如果是客戶端,則網路連接將超時,因此您可能會遇到一個突然的問題,即立即消失的鎖。但是,如果客戶端是中間件,這可能不是問題,因為所有其他連接也會中斷。如果是伺服器,事務將中止。
最大的問題是開發人員的短視。例如,假設您編寫了一個呼叫 Web 服務的儲存過程,並且那裡的網路連接超時。或者假設您連接回客戶端電腦以請求輸入是否繼續儲存過程並且使用者從不響應。通常,當您暫停事務以等待數據庫外部的某些內容時,會發生不好的事情。