我正在用Java開發Java中的數據庫程序。我需要知道如何從Java端鎖定數據庫記錄。如何鎖定來自Java的數據庫記錄?
示例:我們有一個數據庫表cheques
,表中有5條記錄(record 1
到5
)。有2個用戶,user-1
和user-2
。 user-1
訪問record 1
和user-2
嘗試同時訪問record 1
。我想鎖定record 1
以防止user-2
訪問該記錄,而user-1
正在訪問該記錄。我如何在Java中做到這一點?
我正在用Java開發Java中的數據庫程序。我需要知道如何從Java端鎖定數據庫記錄。如何鎖定來自Java的數據庫記錄?
示例:我們有一個數據庫表cheques
,表中有5條記錄(record 1
到5
)。有2個用戶,user-1
和user-2
。 user-1
訪問record 1
和user-2
嘗試同時訪問record 1
。我想鎖定record 1
以防止user-2
訪問該記錄,而user-1
正在訪問該記錄。我如何在Java中做到這一點?
這取決於您正在使用的環境。對於容器管理的事務,你的容器爲你管理事務,你所要做的就是將鎖定模式設置爲lockmode.write。它的作用是在userA訪問記錄1時阻止對類方法的所有寫入訪問。另一方面,對於獨立應用程序,您可以將Synchronization關鍵字添加到方法中以控制併發訪問。我希望這有幫助。
並非每個數據庫都支持每個記錄鎖定。
通常,如果您處於EE環境中,則可以使用JPA EntityManager#find()方法鎖定某些記錄。
全部使用將像
// EntityManager em;
YourClass obj = em.find(YourClass.class, primaryKey, LockModeType.WRITE);
// do something
em.merge(obj);
交易完成後提交的結果將被釋放。
在非EE環境下,正如Darshan Mehta所說,connection.createStatement().execute("SELECT * FROM table FOR UPDATE")
將是解決方案。
謝謝GKlimov。 – Mahesh
MySQL負責爲您爭取:http://dev.mysql.com/doc/refman/5.0/en/internal-locking.html這是使用關係數據庫而不是滾動自己的好處之一數據存儲。你有什麼問題? –
MySQL爲你做。 – JHS
僅當MySQL內置鎖定不充分時才需要這種鎖定。請指定您如何訪問數據庫 - JDBC,JPA,還有其他的東西? – rootkit