我有一個Java前端和一個MySQL後端場景,我在SELECT中使用了'LOCK IN SHARE MODE'。如果我從另一個進程請求同一行,它會提供數據。但是,它不允許我更新。我想要做的是通知用戶他們只有一個只讀副本,所以如果他們希望看到他們可以的信息,他們可以稍後請求它。如何檢查ROW的狀態,以便用戶會被告知這種情況?如果我使用'FOR UPDATE',它只是等待,直到第一個用戶保存數據。我覺得它不那麼用戶友好,如果他們只是有一個空白的屏幕或當他們點擊按鈕它什麼都不做。任何幫助將不勝感激。使用MySQL 5.5,Java 7.通過Java檢查MySQL表的ROW LOCK STATUS
回答
簡短的回答是「你不能」!您可能想看看this discussion。
[編輯]
這個問題的答案後狀態:
你不能(檢查鎖定的狀態)非命名鎖!!!!更多信息: http://forums.mysql.com/read.php?21,222363,223774#msg-223774
行級鎖不適用於應用程序級鎖。它們只是實現一致讀寫的手段。這意味着你必須儘快釋放它們。你需要實現你自己的應用程序級鎖,這並不困難。也許一個簡單的user_id
字段就可以做到。如果它是空的,那麼就沒有鎖。但是,如果它不爲空,則該ID指示誰持有該記錄。在這種情況下,您需要行級鎖定來更新user_id
字段。正如我之前所說的,只要您完成鎖定/解鎖記錄,就必須釋放MySQL鎖定。
謝謝@Mehran ..我確實去了通過鏈接..它是一樣的ROW LEVEL鎖定呢?鏈接談論表鎖定.. – PaulFrancis
這個問題的全部前提在於,RDBMS的行級鎖定(通常用於短期的併發控制)直接用於交互式UI控制。
但撇開這一邊,回答這個問題,可以設置會話的innodb_lock_wait_timeout
在很短的值,最小值爲1
,並且能夠捕獲導致鎖等待超時超標;嘗試在無法鎖定時重新啓動事務。
異常類是com.mysql.jdbc.exceptions.jdbc4.MySQLTransactionRollbackException
當我剛剛嘗試mysql-connector-java 5.1.38
,但其他異常類已經發布更改,所以這也可能會在舊版本的MySQL Connector/J中有所不同。
獲取鎖的「嘗試和失敗」方法是解決這些類型的併發情況的標準方法,因爲「嘗試之前檢查」的替代方法是一種反模式,可在檢查和檢查之間創建競爭條件實際嘗試鎖定。
- 1. Flask-SQLAlchemy with_for_update()row lock
- 2. 當mysql row = true時檢查複選框?
- 3. Mysql的查詢,通過表
- 4. mysql的:通過查找表
- 5. 通過連接表上的參數檢查減慢MySQL查詢
- 6. IP檢查通過列表
- 7. 通過列表檢查的Prolog查詢
- 8. 檢查列表是否存在於Mysql表中通過php
- 9. 檢查Cocoa中Caps Lock的狀態
- 10. 檢查通過
- 11. 通過Java檢查域名年齡
- 12. java - TCP - 通過函數檢查數據
- 13. 如何檢查一個mysql表可訪問或不通過php
- 14. 總ROW Mysql的C#
- 15. 通過mysql和mysqli檢測MySQL查詢的哪部分工作
- 16. 呈現通過JDBC檢索表 - JAVA
- 17. MySQL查詢通過
- 18. Mysql count row left
- 19. php mysql get row
- 20. Mysql row always = 1
- 21. PHP MYSQL $ row [$ variable]
- 22. 通過CSP證書檢查通過C#
- 23. 檢查通過ADB
- 24. 檢查通過JDBC
- 25. MySQL通過很多表查找記錄
- 26. 的MySQL - 通過查詢
- 27. 通過PHP檢測MySQL InnoDB
- 28. 檢測鎖定表(由LOCK TABLE鎖定)
- 29. 如何通過檢查報表
- 30. 從SQL表通過檢查多列
@Nambari:我明白了,但問題是它不會拋出任何異常。如果是這樣,我會一直能夠使用該信息並顯示一條消息.. :( – PaulFrancis