首頁  >  文章  >  資料庫  >  mysql中的鎖定問題

mysql中的鎖定問題

黄舟
黄舟原創
2016-12-15 11:38:38808瀏覽

鎖問題
13.1 取得鎖定等待情況
可以透過檢查table_locks_waited 和table_locks_immediate 狀態變數來分析系統上的表格鎖定爭奪:
mysql> show status like 'Table%';
+----------
mysql> show status like 'Table%';
+---------- ------------------+----------+
| Variable_name | Value |
+------------ ----------------+----------+
| Table_locks_immediate | 105 |
| Table_locks_waited | 3 |
+-------- --------------------------------+----------+
2 rows in set (0.00 sec)
可以透過檢查Innodb_row_lock 狀態變數來分析系統上的行鎖的爭奪情況:
mysql> show status like 'innodb_row_lock%';
+---------------------------- ------------+----------+
| Variable_name | Value |
+------------------ ----------------------+----------+
| Innodb_row_lock_current_waits | 0 |
| Innodb_row_lock_time | 2001 |
| Innodb_row_lock_time_avg | 667 |
| Innodb_row_lock_time_max | 845 |
| Innodb_row_lock_waits | 3 |
+---------------------------------- ------+----------+
5 rows in set (0.00 sec)
另外,針對Innodb 類型的表,如果需要察看當前的鎖等待情況,可以設定InnoDB Monitors,然後透過Show innodb status 察看,設定的方式是:
CREATE TABLE innodb_monitor(a INT) ENGINE=INNODB;
監視器可以透過發出下列語句來被停止:
DROP TABLE innodb_monitor;
設定監視器後,在設定監視器後,show innodbdb_monitor; status 的顯示內容中,會有詳細的當前鎖等待的信息,包括表名、鎖類型、鎖定記錄的情況等等,以便於進行進一步的分析和問題的確定。開啟監視器以後,預設每15 秒會向日誌中記錄監控的內容,如果長時間開啟會導致.err 檔案變得非常的巨大,所以我們在確認問題原因之後,要記得刪除監控表以關閉監視器。或透過使用--console 選項來啟動伺服器以關閉寫入日誌檔案。
13.2 什麼情況下使用表鎖
表級鎖在下列幾種情況下比行級鎖更優越:
1. 很多操作都是讀表。
2. 在嚴格條件的索引上讀取和更新,當更新或刪除可以用單獨的索引來讀取得到時:
3. UPDATE tbl_name SET column=value WHERE unique_key_col=key_value;
4. DELETE FROM tbl_name WHERE unique_key_col=key_value;
5. SELECT 和INSERT 語句並發的執行,但是只有很少的UPDATE 和DELETE 語句。
6. 很多的掃描表和對全表的GROUP BY 操作,但是沒有任何寫表。
13.3 什麼情況下使用行鎖行級鎖定的優點:
1. 當在許多執行緒中存取不同的行時只存在少量鎖定衝突。
2. 回滾時只有少量的變更。
3. 可以長時間鎖定單一的行。
行級鎖定的缺點:
1. 比頁級或表級鎖定佔用更多的記憶體。
2. 在表的大部分中使用時,比頁級或表級鎖定速度慢,因為你必須獲取更多的鎖。

3. 如果你在大部分資料上經常進行GROUP BY 操作或必須經常掃描整個表,比其它鎖定明顯慢很多。

4. 用高級別鎖定,透過支援不同的類型鎖定,你也可以輕鬆地調節應用程序,因為其鎖成本小於行級鎖定。

以上就是mysql中的鎖問題的內容,更多相關文章請關注PHP中文網(www.php.cn)!

🎜🎜
陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn