2012-10-09 21 views
2

我有一個Java前端和一個MySQL後端場景,我在SELECT中使用了'LOCK IN SHARE MODE'。如果我從另一個進程請求同一行,它會提供數據。但是,它不允許我更新。我想要做的是通知用戶他們只有一個只讀副本,所以如果他們希望看到他們可以的信息,他們可以稍後請求它。如何檢查ROW的狀態,以便用戶會被告知這種情況?如果我使用'FOR UPDATE',它只是等待,直到第一個用戶保存數據。我覺得它不那麼用戶友好,如果他們只是有一個空白的屏幕或當他們點擊按鈕它什麼都不做。任何幫助將不勝感激。使用MySQL 5.5,Java 7.通過Java檢查MySQL表的ROW LOCK STATUS

+0

@Nambari:我明白了,但問題是它不會拋出任何異常。如果是這樣,我會一直能夠使用該信息並顯示一條消息.. :( – PaulFrancis

回答

1

簡短的回答是「你不能」!您可能想看看this discussion

[編輯]

這個問題的答案後狀態:

你不能(檢查鎖定的狀態)非命名鎖!!!!更多信息: http://forums.mysql.com/read.php?21,222363,223774#msg-223774

行級鎖不適用於應用程序級鎖。它們只是實現一致讀寫的手段。這意味着你必須儘快釋放它們。你需要實現你自己的應用程序級鎖,這並不困難。也許一個簡單的user_id字段就可以做到。如果它是空的,那麼就沒有鎖。但是,如果它不爲空,則該ID指示誰持有該記錄。在這種情況下,您需要行級鎖定來更新user_id字段。正如我之前所說的,只要您完成鎖定/解鎖記錄,就必須釋放MySQL鎖定。

+0

謝謝@Mehran ..我確實去了通過鏈接..它是一樣的ROW LEVEL鎖定呢?鏈接談論表鎖定.. – PaulFrancis

0

這個問題的全部前提在於,RDBMS的行級鎖定(通常用於短期的併發控制)直接用於交互式UI控制。

但撇開這一邊,回答這個問題,可以設置會話的innodb_lock_wait_timeout在很短的值,最小值爲1,並且能夠捕獲導致鎖等待超時超標;嘗試在無法鎖定時重新啓動事務

異常類是com.mysql.jdbc.exceptions.jdbc4.MySQLTransactionRollbackException當我剛剛嘗試mysql-connector-java 5.1.38,但其他異常類已經發布更改,所以這也可能會在舊版本的MySQL Connector/J中有所不同。

獲取鎖的「嘗試和失敗」方法是解決這些類型的併發情況的標準方法,因爲「嘗試之前檢查」的替代方法是一種反模式,可在檢查和檢查之間創建競爭條件實際嘗試鎖定。