成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

如何解決MySQL中的死鎖問題?

數據庫 MySQL
雖然鎖在一定程度上能夠解決并發(fā)問題,但稍有不慎,就可能造成死鎖。本文介紹死鎖的產生及處理。

[[430124]]

本文轉載自微信公眾號「大數據DT」,作者肖宇 冰河 。轉載本文請聯系大數據DT公眾號。

1 死鎖的產生和預防

發(fā)生死鎖的必要條件有4個,分別為互斥條件、不可剝奪條件、請求與保持條件和循環(huán)等待條件,如圖1-6所示。

▲圖1-6 死鎖的必要條件

1. 互斥條件

在一段時間內,計算機中的某個資源只能被一個進程占用。此時,如果其他進程請求該資源,則只能等待。

2. 不可剝奪條件

某個進程獲得的資源在使用完畢之前,不能被其他進程強行奪走,只能由獲得資源的進程主動釋放。

3. 請求與保持條件

進程已經獲得了至少一個資源,又要請求其他資源,但請求的資源已經被其他進程占有,此時請求的進程就會被阻塞,并且不會釋放自己已獲得的資源。

4. 循環(huán)等待條件

系統(tǒng)中的進程之間相互等待,同時各自占用的資源又會被下一個進程所請求。例如有進程A、進程B和進程C三個進程,進程A請求的資源被進程B占用,進程B請求的資源被進程C占用,進程C請求的資源被進程A占用,于是形成了循環(huán)等待條件,如圖1-7所示。

▲圖1-7 死鎖的循環(huán)等待條件

需要注意的是,只有4個必要條件都滿足時,才會發(fā)生死鎖。

處理死鎖有4種方法,分別為預防死鎖、避免死鎖、檢測死鎖和解除死鎖,如圖1-8所示。

▲圖1-8 處理死鎖的方法

  • 預防死鎖:處理死鎖最直接的方法就是破壞造成死鎖的4個必要條件中的一個或多個,以防止死鎖的發(fā)生。
  • 避免死鎖:在系統(tǒng)資源的分配過程中,使用某種策略或者方法防止系統(tǒng)進入不安全狀態(tài),從而避免死鎖的發(fā)生。
  • 檢測死鎖:這種方法允許系統(tǒng)在運行過程中發(fā)生死鎖,但是能夠檢測死鎖的發(fā)生,并采取適當的措施清除死鎖。
  • 解除死鎖:當檢測出死鎖后,采用適當的策略和方法將進程從死鎖狀態(tài)解脫出來。

在實際工作中,通常采用有序資源分配法和銀行家算法這兩種方式來避免死鎖,大家可自行了解。

2 MySQL中的死鎖問題

在MySQL 5.5.5及以上版本中,MySQL的默認存儲引擎是InnoDB。該存儲引擎使用的是行級鎖,在某種情況下會產生死鎖問題,所以InnoDB存儲引擎采用了一種叫作等待圖(wait-for graph)的方法來自動檢測死鎖,如果發(fā)現死鎖,就會自動回滾一個事務。

接下來,我們看一個MySQL中的死鎖案例。

第一步:打開終端A,登錄MySQL,將事務隔離級別設置為可重復讀,開啟事務后為account數據表中id為1的數據添加排他鎖,如下所示。

  1. mysql> set session transaction isolation level repeatable read
  2. Query OK, 0 rows affected (0.00 sec) 
  3.  
  4. mysql> start transaction
  5. Query OK, 0 rows affected (0.00 sec) 
  6.  
  7. mysql> select * from account where id =1 for update
  8. +----+--------+---------+ 
  9. | id | name   | balance | 
  10. +----+--------+---------+ 
  11. |  1 | 張三   |     300 | 
  12. +----+--------+---------+ 
  13. 1 row in set (0.00 sec) 

第二步:打開終端B,登錄MySQL,將事務隔離級別設置為可重復讀,開啟事務后為account數據表中id為2的數據添加排他鎖,如下所示。

  1. mysql> set session transaction isolation level repeatable read
  2. Query OK, 0 rows affected (0.00 sec) 
  3.  
  4. mysql> start transaction
  5. Query OK, 0 rows affected (0.00 sec) 
  6.  
  7. mysql> select * from account where id =2 for update
  8. +----+--------+---------+ 
  9. | id | name   | balance | 
  10. +----+--------+---------+ 
  11. |  2 | 李四   |     350 | 
  12. +----+--------+---------+ 
  13. 1 row in set (0.00 sec) 

第三步:在終端A為account數據表中id為2的數據添加排他鎖,如下所示。

  1. mysql> select * from account where id =2 for update

此時,線程會一直卡住,因為在等待終端B中id為2的數據釋放排他鎖。

第四步:在終端B中為account數據表中id為1的數據添加排他鎖,如下所示。

  1. mysql> select * from account where id =1 for update
  2. ERROR 1213 (40001): Deadlock found when trying to get lock; try restarting transaction 

此時發(fā)生了死鎖。通過如下命令可以查看死鎖的日志信息。

  1. show engine innodb status\G 

通過命令行查看LATEST DETECTED DEADLOCK選項相關的信息,可以發(fā)現死鎖的相關信息,或者通過配置innodb_print_all_deadlocks(MySQL 5.6.2版本開始提供)參數為ON,將死鎖相關信息打印到MySQL錯誤日志中。

在MySQL中,通常通過以下幾種方式來避免死鎖。

  1. 盡量讓數據表中的數據檢索都通過索引來完成,避免無效索引導致行鎖升級為表鎖。
  2. 合理設計索引,盡量縮小鎖的范圍。
  3. 盡量減少查詢條件的范圍,盡量避免間隙鎖或縮小間隙鎖的范圍。
  4. 盡量控制事務的大小,減少一次事務鎖定的資源數量,縮短鎖定資源的時間。
  5. 如果一條SQL語句涉及事務加鎖操作,則盡量將其放在整個事務的最后執(zhí)行。
  6. 盡可能使用低級別的事務隔離機制。

關于作者:肖宇,分布式事務架構專家,Apache ShenYu(incubating)網關創(chuàng)始人,Dromara開源組織創(chuàng)始人,Hmily、RainCat、Myth等分布式事務框架的作者。Apache ShardingSphere Committer。

冰河,互聯網高級技術專家、MySQL技術專家、分布式事務架構專家。多年來,一直致力于分布式系統(tǒng)架構、微服務、分布式數據庫、分布式事務與大數據技術的研究,在高并發(fā)、高可用、高可擴展性、高可維護性和大數據等領域擁有豐富的架構經驗。

 

本文摘編自《深入理解分布式事務:原理與實戰(zhàn)》,經出版方授權發(fā)布。

 

責任編輯:武曉燕 來源: 大數據DT
相關推薦

2010-04-29 17:46:31

Oracle死鎖

2024-01-10 09:44:11

MySQL死鎖

2021-06-08 08:38:36

MySQL數據庫死鎖問題

2024-12-05 09:06:58

2023-10-30 18:35:47

MySQL主從延時

2024-06-21 09:37:57

2011-08-08 10:29:12

MySQL

2017-09-23 22:07:24

深度學習N 體問題GAN

2017-09-28 10:40:10

深度學習多體問題多代理系統(tǒng)

2011-06-16 14:12:30

Qt Mysql 驅動

2025-02-11 12:29:58

2012-09-05 11:09:15

SELinux操作系統(tǒng)

2019-11-05 14:00:23

Windows 10Outlook附件

2017-10-17 09:21:06

2021-09-26 06:43:07

MySQL深分頁優(yōu)化

2021-11-09 10:20:15

MySQL深分頁數據庫

2021-09-27 13:33:03

MySQL深分頁數據庫

2010-10-08 11:41:38

PHP連接MYSQL

2010-03-15 11:07:13

Python多線程

2018-01-03 08:42:40

Linux命令磁盤空間
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美精品中文字幕久久二区 | 日本羞羞影院 | 午夜精品久久 | 欧美精品tv | 国产精品精品久久久 | 日韩精品在线网站 | 成人激情视频免费观看 | 日本天天操 | 日日摸夜夜添夜夜添精品视频 | 一级黄色日本片 | 亚洲精品久久视频 | 成人精品国产 | 中文字幕在线三区 | 国产伦精品一区二区三区视频金莲 | 日本高清不卡视频 | 免费人成激情视频在线观看冫 | 欧美片网站免费 | 少妇特黄a一区二区三区88av | 国产一区二区 | 精品国产色 | 日韩国产欧美 | 午夜精品一区二区三区在线播放 | 91精品国产一区二区三区香蕉 | 成人免费网站视频 | 91精品国产综合久久久动漫日韩 | 欧美午夜在线 | 波多野结衣精品在线 | 91视频.| 在线91| 国色天香综合网 | h漫在线观看| 欧美国产一区二区 | 色婷婷av99xx | 国产一区二区三区久久久久久久久 | 日韩三级在线 | 欧美精品在线观看 | 国产在线精品一区二区三区 | 日韩第一区 | 中文在线一区二区 | 亚洲一区二区三区在线免费 | 在线免费观看视频你懂的 |