国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

MySQL鎖等待與死鎖問題分析

數據庫 MySQL
出現鎖等待或死鎖的原因是訪問數據庫需要加鎖,那你可能要問了,為啥要加鎖呢?原因是為了確保并發更新場景下的數據正確性,保證數據庫事務的隔離性。

 [[389778]]

本文轉載自微信公眾號「MySQL技術」,作者MySQL技術。轉載本文請聯系MySQL技術公眾號。

前言:

在 MySQL 運維過程中,鎖等待和死鎖問題是令各位 DBA 及開發同學非常頭痛的事。出現此類問題會造成業務回滾、卡頓等故障,特別是業務繁忙的系統,出現死鎖問題后影響會更嚴重。本篇文章我們一起來學習下什么是鎖等待及死鎖,出現此類問題又應該如何分析處理呢?

1.了解鎖等待與死鎖

出現鎖等待或死鎖的原因是訪問數據庫需要加鎖,那你可能要問了,為啥要加鎖呢?原因是為了確保并發更新場景下的數據正確性,保證數據庫事務的隔離性。

試想一個場景,如果你要去圖書館借一本《高性能MySQL》,為了防止有人提前把這本書借走,你可以提前進行預約(加鎖),這把鎖可以怎么加?

  • 封鎖圖書館(數據庫級別的鎖)
  • 把數據庫相關的書都鎖住(表級別的鎖)
  • 只鎖 MySQL 相關的書(頁級別的鎖)
  • 只鎖《高性能MySQL》這本書(行級別的鎖)

鎖的粒度越細,并發級別越高,實現也更復雜。

鎖等待也可稱為事務等待,后執行的事務等待前面處理的事務釋放鎖,但是等待時間超過了 MySQL 的鎖等待時間,就會引發這個異常。等待超時后的報錯為“Lock wait timeout exceeded...”。

死鎖發生的原因是兩個事務互相等待對方釋放相同資源的鎖,從而造成的死循環。產生死鎖后會立即報錯“Deadlock found when trying to get lock...”。

2.現象復現及處理

下面我們以 MySQL 5.7.23 版本為例(隔離級別是 RR ),來復現下上述兩種異常現象。

  1. mysql> show create table test_tb\G 
  2. *************************** 1. row *************************** 
  3.        Table: test_tb 
  4. Create TableCREATE TABLE `test_tb` ( 
  5.   `id` int(11) NOT NULL AUTO_INCREMENT, 
  6.   `col1` varchar(50) NOT NULL DEFAULT ''
  7.   `col2` int(11) NOT NULL DEFAULT '1'
  8.   `col3` varchar(20) NOT NULL DEFAULT ''
  9.   PRIMARY KEY (`id`), 
  10.   KEY `idx_col1` (`col1`) 
  11. ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 
  12. 1 row in set (0.00 sec) 
  13.  
  14. mysql> select * from test_tb; 
  15. +----+------+------+------+ 
  16. | id | col1 | col2 | col3 | 
  17. +----+------+------+------+ 
  18. |  1 | fdg  |    1 | abc  | 
  19. |  2 | a    |    2 | fg   | 
  20. |  3 | ghrv |    2 | rhdv | 
  21. +----+------+------+------+ 
  22. rows in set (0.00 sec) 
  23.  
  24. # 事務一首先執行 
  25. mysql> begin
  26. Query OK, 0 rows affected (0.00 sec) 
  27.  
  28. mysql> select * from test_tb where col1 = 'a' for update
  29. +----+------+------+------+ 
  30. | id | col1 | col2 | col3 | 
  31. +----+------+------+------+ 
  32. |  2 | a    |    2 | fg   | 
  33. +----+------+------+------+ 
  34. 1 row in set (0.00 sec) 
  35.  
  36. # 事務二然后執行 
  37. mysql> begin
  38. Query OK, 0 rows affected (0.01 sec) 
  39.  
  40. mysql> update test_tb set col2 = 1 where col1 = 'a'
  41. ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction 

出現上種異常的原因是事務二在等待事務一的行鎖,但事務一一直沒提交,等待超時而報錯。InnoDB 行鎖等待超時時間由 innodb_lock_wait_timeout 參數控制,此參數默認值為 50 ,單位為秒,即默認情況下,事務二會等待 50s ,若仍拿不到行鎖則會報等待超時異常并回滾此條語句。

對于 5.7 版本,出現鎖等待時,我們可以查看 information_schema 中的幾張系統表來查詢事務狀態。

  • innodb_trx 當前運行的所有事務。
  • innodb_locks 當前出現的鎖。
  • innodb_lock_waits 鎖等待的對應關系
  1. # 鎖等待發生時 查看innodb_trx表可以看到所有事務  
  2. # trx_state值為LOCK WAIT 則代表該事務處于等待狀態 
  3.  
  4. mysql> select * from information_schema.innodb_trx\G 
  5. *************************** 1. row *************************** 
  6.                     trx_id: 38511 
  7.                  trx_state: LOCK WAIT 
  8.                trx_started: 2021-03-24 17:20:43 
  9.      trx_requested_lock_id: 38511:156:4:2 
  10.           trx_wait_started: 2021-03-24 17:20:43 
  11.                 trx_weight: 2 
  12.        trx_mysql_thread_id: 1668447 
  13.                  trx_query: update test_tb set col2 = 1 where col1 = 'a' 
  14.        trx_operation_state: starting index read 
  15.          trx_tables_in_use: 1 
  16.          trx_tables_locked: 1 
  17.           trx_lock_structs: 2 
  18.      trx_lock_memory_bytes: 1136 
  19.            trx_rows_locked: 1 
  20.          trx_rows_modified: 0 
  21.    trx_concurrency_tickets: 0 
  22.        trx_isolation_level: REPEATABLE READ 
  23.          trx_unique_checks: 1 
  24.     trx_foreign_key_checks: 1 
  25. trx_last_foreign_key_error: NULL 
  26.  trx_adaptive_hash_latched: 0 
  27.  trx_adaptive_hash_timeout: 0 
  28.           trx_is_read_only: 0 
  29. trx_autocommit_non_locking: 0 
  30. *************************** 2. row *************************** 
  31.                     trx_id: 38510 
  32.                  trx_state: RUNNING 
  33.                trx_started: 2021-03-24 17:18:54 
  34.      trx_requested_lock_id: NULL 
  35.           trx_wait_started: NULL 
  36.                 trx_weight: 4 
  37.        trx_mysql_thread_id: 1667530 
  38.                  trx_query: NULL 
  39.        trx_operation_state: NULL 
  40.          trx_tables_in_use: 0 
  41.          trx_tables_locked: 1 
  42.           trx_lock_structs: 4 
  43.      trx_lock_memory_bytes: 1136 
  44.            trx_rows_locked: 3 
  45.          trx_rows_modified: 0 
  46.    trx_concurrency_tickets: 0 
  47.        trx_isolation_level: REPEATABLE READ 
  48.          trx_unique_checks: 1 
  49.     trx_foreign_key_checks: 1 
  50. trx_last_foreign_key_error: NULL 
  51.  trx_adaptive_hash_latched: 0 
  52.  trx_adaptive_hash_timeout: 0 
  53.           trx_is_read_only: 0 
  54. trx_autocommit_non_locking: 0 
  55. rows in set (0.00 sec) 
  56.  
  57. # innodb_trx 字段值含義 
  58. trx_id:事務ID。 
  59. trx_state:事務狀態,有以下幾種狀態:RUNNING、LOCK WAIT、ROLLING BACK 和 COMMITTING。 
  60. trx_started:事務開始時間。 
  61. trx_requested_lock_id:事務當前正在等待鎖的標識,可以和 INNODB_LOCKS 表 JOIN 以得到更多詳細信息。 
  62. trx_wait_started:事務開始等待的時間。 
  63. trx_weight:事務的權重。 
  64. trx_mysql_thread_id:事務線程 ID,可以和 PROCESSLIST 表 JOIN。 
  65. trx_query:事務正在執行的 SQL 語句。 
  66. trx_operation_state:事務當前操作狀態。 
  67. trx_tables_in_use:當前事務執行的 SQL 中使用的表的個數。 
  68. trx_tables_locked:當前執行 SQL 的行鎖數量。 
  69. trx_lock_structs:事務保留的鎖數量。 
  70. trx_isolation_level:當前事務的隔離級別。 
  71.  
  72. # sys.innodb_lock_waits 視圖也可看到事務等待狀況,且給出了殺鏈接的SQL 
  73. mysql> select * from sys.innodb_lock_waits\G 
  74. *************************** 1. row *************************** 
  75.                 wait_started: 2021-03-24 17:20:43 
  76.                     wait_age: 00:00:22 
  77.                wait_age_secs: 22 
  78.                 locked_table: `testdb`.`test_tb` 
  79.                 locked_index: idx_col1 
  80.                  locked_type: RECORD 
  81.               waiting_trx_id: 38511 
  82.          waiting_trx_started: 2021-03-24 17:20:43 
  83.              waiting_trx_age: 00:00:22 
  84.      waiting_trx_rows_locked: 1 
  85.    waiting_trx_rows_modified: 0 
  86.                  waiting_pid: 1668447 
  87.                waiting_query: update test_tb set col2 = 1 where col1 = 'a' 
  88.              waiting_lock_id: 38511:156:4:2 
  89.            waiting_lock_mode: X 
  90.              blocking_trx_id: 38510 
  91.                 blocking_pid: 1667530 
  92.               blocking_query: NULL 
  93.             blocking_lock_id: 38510:156:4:2 
  94.           blocking_lock_mode: X 
  95.         blocking_trx_started: 2021-03-24 17:18:54 
  96.             blocking_trx_age: 00:02:11 
  97.     blocking_trx_rows_locked: 3 
  98.   blocking_trx_rows_modified: 0 
  99.      sql_kill_blocking_query: KILL QUERY 1667530 
  100. sql_kill_blocking_connection: KILL 1667530 

sys.innodb_lock_waits 視圖整合了事務等待狀況,同時給出殺掉堵塞源端的 kill 語句。不過是否要殺掉鏈接還是需要綜合考慮的。

死鎖與鎖等待稍有不同,我們同樣也來簡單復現下死鎖現象。

  1. # 開啟兩個事務 
  2. # 事務一執行 
  3. mysql> update test_tb set col2 = 1 where col1 = 'a'
  4. Query OK, 1 row affected (0.00 sec) 
  5. Rows matched: 1  Changed: 1  Warnings: 0 
  6.  
  7. # 事務二執行 
  8. mysql> update test_tb set col2 = 1 where id = 3; 
  9. Query OK, 1 row affected (0.00 sec) 
  10. Rows matched: 1  Changed: 1  Warnings: 0 
  11.  
  12. # 回到事務一執行 回車后 此條語句處于鎖等待狀態 
  13. mysql> update test_tb set col1 = 'abcd' where id = 3; 
  14. Query OK, 1 row affected (5.71 sec) 
  15. Rows matched: 1  Changed: 1  Warnings: 0 
  16.  
  17. # 回到事務二再執行 此時二者相互等待發生死鎖 
  18. mysql> update test_tb set col3 = 'gddx' where col1 = 'a'
  19. ERROR 1213 (40001): Deadlock found when trying to get lock; try restarting transaction 

發生死鎖后會選擇一個事務進行回滾,想查明死鎖原因,可以執行 show engine innodb status 來查看死鎖日志,根據死鎖日志,結合業務邏輯來進一步定位死鎖原因。

在實際應用中,我們要盡量避免死鎖現象的發生,可以從以下幾個方面入手:

  • 事務盡可能小,不要講復雜邏輯放進一個事務里。
  • 涉及多行記錄時,約定不同事務以相同順序訪問。
  • 業務中要及時提交或者回滾事務,可減少死鎖產生的概率。
  • 表要有合適的索引。
  • 可嘗試將隔離級別改為 RC 。

總結:

本篇文章簡單介紹了鎖等待及死鎖發生的原因,其實真實業務中發生死鎖還是很難分析的,需要一定的經驗積累。本篇文章只是面向初學者,希望各位對死鎖能夠有個初印象。

 

責任編輯:武曉燕 來源: MySQL技術
相關推薦

2020-04-23 11:43:55

MySQL數據庫SQL

2010-06-30 14:15:08

SQL Server死

2024-10-16 11:40:47

2020-04-14 10:20:12

MySQL數據庫死鎖

2017-06-07 16:10:24

Mysql死鎖死鎖日志

2010-08-10 13:36:00

2011-08-24 17:41:16

MySQL死鎖

2010-08-02 17:30:30

DB2鎖等待

2024-10-30 10:38:08

2025-03-03 04:00:00

線程安全CPU

2017-06-14 22:11:57

數據庫MySQL死鎖

2010-08-10 08:42:35

DB2鎖等待

2010-08-19 09:54:42

DB2死鎖

2021-06-08 08:38:36

MySQL數據庫死鎖問題

2021-07-04 22:29:12

MySQL死鎖云日志

2010-08-20 08:52:25

DB2死鎖

2018-07-31 10:10:06

MySQLInnoDB死鎖

2020-07-16 21:20:08

數據庫MySQL死鎖

2017-05-03 16:26:24

MySQL并發死鎖

2020-12-17 10:23:41

死鎖LinuxLockdep
點贊
收藏

51CTO技術棧公眾號

91麻豆精品国产综合久久久 | 欧美日韩在线二区| 欧美电影免费提供在线观看| 美女被人操视频在线观看| 国产欧美一区二区三区网站| 自拍亚洲欧美老师丝袜| 99热在线精品观看| 成人片在线免费看| 国产精品毛片一区二区在线看| 欧美极品美女电影一区| 精品自拍视频| 久久精品成人欧美大片| 欧美动物xxx| 亚洲精品二三区| a'aaa级片在线观看| 精品不卡在线视频| av2020不卡| 日韩精品视频在线播放| 久久青草伊人| 中文字幕亚洲综合久久| 日韩精品第二页| 波霸ol色综合久久| 久久三级中文| 欧美亚洲午夜视频在线观看| 久操精品在线| 亚洲综合在线小说| 久久精品网址| 九九久久九九久久| 2023国产精品自拍| 黄色成人av| 欧洲生活片亚洲生活在线观看| 欧美黄色激情| 亚洲国产精品推荐| 亚洲爽爆av| 国产黑人绿帽在线第一区| 欧美高清一区| 国产美女视频免费| 久久久国产午夜精品| 免费播放av| 欧美电影一区二区三区| 欧美特黄aaaaaaaa大片| 久久久久久久久国产| 国产精品成人a在线观看| 久久久影院一区二区三区| 韩国成人在线视频| 欧美自拍小视频| 欧美三级xxx| 2020日本在线视频中文字幕| 久久成人这里只有精品| 99精品网站| 看全色黄大色大片| 最新热久久免费视频| 最新国产在线观看| 色偷偷888欧美精品久久久| 午夜a一级毛片亚洲欧洲| 114国产精品久久免费观看| 韩国av一区二区三区四区| 亚洲欧美自偷自拍另类| 欧美性极品少妇| 亚洲国产91视频| 成人综合网网址| 国产麻豆欧美日韩一区| 午夜国产视频| 国产视频丨精品|在线观看| 女人av一区| 一区二区三区一级片| 中文字幕亚洲欧美在线不卡| 亚洲天堂男人天堂| 最新中文字幕2018| 国产精品毛片久久久久久| 伊人国产在线| 欧美精品一区二区三区在线| 婷婷综合国产| 国产亚洲精品美女久久久m| 成人精品视频一区二区三区尤物| 国产aa视频| 亚洲第一中文字幕| 欧美日韩一区二区综合| 中文字幕第50页| 午夜视频在线观看一区二区| 国产不卡123| 国产精品视频白浆免费视频| 久久爱www久久做| 亚洲伦理电影| 一区二区欧美日韩视频| 午夜精品国产| 在线免费视频一区| 精品国产免费视频| 色综合色综合| 999香蕉视频| 日韩免费成人网| 久久最新网址| 成年人网站国产| 欧美男女性生活在线直播观看| 亚洲成人黄色| 成人在线观看www| 日本韩国精品一区二区在线观看| 高清一区二区| 亚洲五月六月| 一本久道久久综合中文字幕| 亚洲**毛片| 成人精品视频在线播放| 在线成人av影院| 我不卡神马影院| 成年人免费视频观看| 日韩一区二区av| 美女脱光内衣内裤视频久久网站| 在线视频中文字幕| 97精品免费视频| 国产成人av电影在线播放| 18视频在线观看网站| 亚洲a成v人在线观看| 亚洲男女一区二区三区| 一区二区三区亚洲变态调教大结局| 中文视频一区视频二区视频三区| 欧美日韩免费不卡视频一区二区三区 | 综合分类小说区另类春色亚洲小说欧美| 永久免费毛片在线播放| 国产青春久久久国产毛片| 成人免费在线视频| 日本99精品| 99视频在线免费| 美日韩精品视频免费看| 大尺度一区二区| 日本精品不卡| 成人av在线播放观看| 日韩精品一区二区三区第95| 男人天堂欧美日韩| 成人黄色在线电影| 精品国产乱码久久久久久丨区2区 精品国产乱码久久久久久蜜柚 | 在线视频1区2区| 亚洲一区二区三区sesese| 亚洲成人免费影院| 久久福利影院| 日本午夜在线| 91日本在线视频| 91久久精品一区二区二区| 欧美阿v一级看视频| 先锋影音欧美性受| 51蜜桃传媒精品一区二区| 狠狠躁夜夜躁人人爽天天天天97| 欧美综合一区| 神马精品久久| 92看片淫黄大片欧美看国产片| 亚洲成人一二三| 欧美一区激情| 51xtv成人影院| 亚洲最大色综合成人av| 亚洲欧美制服综合另类| aaa亚洲精品| 色婷婷久久久| 伊人av免费在线观看| 国产一区精品视频| 日韩成人在线视频观看| 97久久超碰国产精品| 日韩欧美黄色| 国产一区二区三区不卡在线| 日韩精品成人一区二区在线观看| 日韩电影在线观看中文字幕| av亚洲精华国产精华| 久久久久久毛片免费看| 亚洲色图另类色图| 日韩电影免费观看高清完整| 在线看日韩av| 亚洲视频综合在线| 激情文学一区| 视频精品导航| 大地资源高清播放在线观看| 国产自产精品| 正在播放亚洲1区| 国产精品情趣视频| 中文字幕免费一区二区| 极品在线视频| 天天干天天爽天天射| 亚洲在线第一页| 日韩精品在线观看一区| 亚洲婷婷综合久久一本伊一区| 93在线视频精品免费观看| 国产极品人妖在线观看| 男人的天堂日韩| 国内精品一区二区| 久久成人精品视频| 欧美优质美女网站| 久久日韩精品一区二区五区| 亚洲天天影视网| 欧美黄色成人| 91se在线| 黄大色黄女片18第一次| 色婷婷精品国产一区二区三区| 欧美激情欧美激情| 日韩欧美在线影院| 亚洲另类在线视频| 极品尤物av久久免费看| 午夜片欧美伦| 亚洲经典视频| av中文字幕电影在线看| 在线激情av| 一区二区成人网| 亚洲欧美99| 国产日韩欧美日韩大片|