簡體   English   中英

使用Java鎖進行數據庫並發

[英]Using Java locks for database concurrency

我有以下情況。 我有兩張桌子。 一個存儲作為交易計數器的多個值。 通過Java應用程序,將讀取,遞增第一個表值並將其寫入第二個表,並將新值寫回第一個表。 顯然,由於這是一個多用戶系統,因此有可能出錯。 我的解決方案,在Java中,這個問題是提供有,也應該成為獲得性可以在任一台在采取任何行動之前鎖。 這些鎖(即ReentrantLocks)是靜態的,表1中的每一列都有一個,因為這些值是完全相互獨立的。

這是推薦的方法嗎?

干杯。

。對數據庫並發使用隱式數據庫鎖 1 關系數據庫支持事務,這是ACID的重要組成部分:請使用它們。

以Java為中心的鎖定將無法在多VM中使用 ,因此在多用戶/服務器環境中將無濟於事


1數據庫足夠聰明,可以獲取/釋放鎖以確保一致性和隔離性,甚至可以使用“無鎖”實現,例如MVCC。 極少數情況下,必須請求顯式數據庫鎖定,但這是高級用例。

雖然同意@pst回答的某些觀點,但我會說這在一定程度上取決於。

如果事件的順序基本上(並且將始終是“面向SQL的”),那么您也可以在數據庫級別進行鎖定(實際上,可能是通過使用事務來隱式鎖定)。

但是,如果您的應用程序層中有重要的數據操作邏輯 (或計划在其中進行構建)(通常是在這種特定操作的情況下),那么鎖定應用程序級別可能更合適。 (實際上,您可能仍會在事務中運行SQL,以便實際上在兩個級別上都處於鎖定狀態。)

我認為,由於依賴於數據庫級鎖定,多個VM本身並不一定是一個引人注目的問題。 如果您有多個服務器應用程序正在訪問數據庫,則無論如何都要建立一個定義明確的協議,在何種情況下可以同時訪問數據。 在中等復雜度的系統中,無論如何您都希望構建一個對數據進行定期完整性檢查的系統。 (即使您的服務器應用程序在100%的時間內運行良好,后端技術支持也永遠不會在應用程序外部的數據庫上運行一些其他SQL ...?)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM