2013-07-02 58 views
2

我正在用Java開發Java中的數據庫程序。我需要知道如何從Java端鎖定數據庫記錄。如何鎖定來自Java的數據庫記錄?

示例:我們有一個數據庫表cheques,表中有5條記錄(record 15)。有2個用戶,user-1user-2user-1訪問record 1user-2嘗試同時訪問record 1。我想鎖定record 1以防止user-2訪問該記錄,而user-1正在訪問該記錄。我如何在Java中做到這一點?

+1

MySQL負責爲您爭取:http://dev.mysql.com/doc/refman/5.0/en/internal-locking.html這是使用關係數據庫而不是滾動自己的好處之一數據存儲。你有什麼問題? –

+0

MySQL爲你做。 – JHS

+0

僅當MySQL內置鎖定不充分時才需要這種鎖定。請指定您如何訪問數據庫 - JDBC,JPA,還有其他的東西? – rootkit

回答

1

如果是MySQL,可以使用SELECT FOR UPDATE聲明來鎖定記錄。在事務完成或回滾之前,鎖將不會被釋放。 更多關於相同here

+0

你的答案幫了我。非常感謝你。 – Mahesh

+0

我該怎麼做。請告訴我因爲我是新來這個論壇。 – Mahesh

+0

在答案的左側,填寫查找刻度標記按鈕。只需點擊它。它將充滿綠色。以下鏈接演示相同: http://stackoverflow.com/help/accepted-answer –

1

這取決於您正在使用的環境。對於容器管理的事務,你的容器爲你管理事務,你所要做的就是將鎖定模式設置爲lockmode.write。它的作用是在userA訪問記錄1時阻止對類方法的所有寫入訪問。另一方面,對於獨立應用程序,您可以將Synchronization關鍵字添加到方法中以控制併發訪問。我希望這有幫助。

0

並非每個數據庫都支持每個記錄鎖定。

通常,如果您處於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")將是解決方案。

+0

謝謝GKlimov。 – Mahesh