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

聊聊MySQL中的死鎖

數據庫 MySQL
由于sql執行較快,直接執行上面兩個事務中的sql可能不會產生死鎖的情況,我們可以稍做修改,也就在UPDATE語句后面加上SLEEP函數,SLEEP會讓當前進程暫停執行指定的時間(單位為秒)。

死鎖是指兩個或者多個事務互相持有對方所需的資源,從而導致它們都無法繼續執行的情況。下圖是一個死鎖的示例,事務1鎖住了id=1的數據(比如更新id=1的數據記錄),同時請求鎖住id=2的數據,但事務2持有id=2的鎖,同時又請求id=1的鎖,這樣就造成了相互等待對方釋放鎖的情況,從而產生了死鎖:

圖片圖片

上圖是死鎖產生的示例說明,我們用實際的SQL來演示死鎖的產生,首先創建一個測試表,它只有兩個字段,id和數量,id為自增類型,然后向表中插入兩條數據:

CREATE TABLE `t_test` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `quantity` int(2) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
INSERT INTO `t_test` VALUES ('1', '1');
INSERT INTO `t_test` VALUES ('2', '2');

如果有兩個事務更新表中id等于1和2的數據,但更新的順序相反,像下面這樣,就會出現死鎖:

圖片圖片

最后,事務2提示死鎖的錯誤,而事務1則執行成功,當然,在事務的最后需要加上COMMIT語句。查詢表中的數據進行確認,發現id=1的數量更新為了101,而id=2的數量更新成了102。

另外,由于sql執行較快,直接執行上面兩個事務中的sql可能不會產生死鎖的情況,我們可以稍做修改,也就在UPDATE語句后面加上SLEEP函數,SLEEP會讓當前進程暫停執行指定的時間(單位為秒)。分別在兩個事務中執行下面的語句,稍等幾秒鐘,就可以看到出現死鎖:

# 事務1
START TRANSACTION;
UPDATE t_test SET quantity=101 WHERE id = 1;
SELECT SLEEP(10) FROM dual;
UPDATE t_test SET quantity=102 WHERE id = 2;
COMMIT;
# 事務2
START TRANSACTION;
UPDATE t_test SET quantity=201 WHERE id = 2;
SELECT SLEEP(10) FROM dual;
UPDATE t_test SET quantity=202 WHERE id = 1;
COMMIT;

在MySQL中,死鎖檢測的選項默認是開啟的:innodb_deadlock_detect,如果InnoDB檢測到死鎖,則會把其中一個或者多個事務進行回滾,以這種方式來解決死鎖,InnoDB會嘗試回滾較小的事務。可以通過執行以下命令來查看死鎖的檢測情況:  

SHOW ENGINE INNODB STATUS;

比如以上兩個事務執行以后,再執行上面的命令,就會看到以下的結果(只摘取死鎖檢測的部分),通過這種方式可以較為清晰的看到死鎖的產生過程:

------------------------
 LATEST DETECTED DEADLOCK
 ------------------------
 2023-11-08 15:57:23 0x4df8
 *** (1) TRANSACTION:
 TRANSACTION 350231, ACTIVE 12 sec starting index read
 mysql tables in use 1, locked 1
 LOCK WAIT 3 lock struct(s), heap size 1136, 2 row lock(s), undo log entries 1
 MySQL thread id 3, OS thread handle 19044, query id 339 localhost ::1 root updating
 UPDATE t_test SET quantity=102 WHERE id = 2
 *** (1) WAITING FOR THIS LOCK TO BE GRANTED:
 RECORD LOCKS space id 743 page no 3 n bits 72 index PRIMARY of table `test`.`t_test` trx id 350231 lock_mode X locks rec but not gap waiting
 Record lock, heap no 3 PHYSICAL RECORD: n_fields 4; compact format; info bits 0
  0: len 4; hex 80000002; asc     ;;
  1: len 6; hex 000000055818; asc     X ;;
  2: len 7; hex 2f000001401cb2; asc /   @  ;;
  3: len 4; hex 800000c9; asc     ;;
 
 *** (2) TRANSACTION:
 TRANSACTION 350232, ACTIVE 10 sec starting index read, thread declared inside InnoDB 5000
 mysql tables in use 1, locked 1
 3 lock struct(s), heap size 1136, 2 row lock(s), undo log entries 1
 MySQL thread id 5, OS thread handle 19960, query id 340 localhost 127.0.0.1 root updating
 UPDATE t_test SET quantity=202 WHERE id = 1
 *** (2) HOLDS THE LOCK(S):
 RECORD LOCKS space id 743 page no 3 n bits 72 index PRIMARY of table `test`.`t_test` trx id 350232 lock_mode X locks rec but not gap
 Record lock, heap no 3 PHYSICAL RECORD: n_fields 4; compact format; info bits 0
  0: len 4; hex 80000002; asc     ;;
  1: len 6; hex 000000055818; asc     X ;;
  2: len 7; hex 2f000001401cb2; asc /   @  ;;
  3: len 4; hex 800000c9; asc     ;;
 
 *** (2) WAITING FOR THIS LOCK TO BE GRANTED:
 RECORD LOCKS space id 743 page no 3 n bits 72 index PRIMARY of table `test`.`t_test` trx id 350232 lock_mode X locks rec but not gap waiting
 Record lock, heap no 2 PHYSICAL RECORD: n_fields 4; compact format; info bits 0
  0: len 4; hex 80000001; asc     ;;
  1: len 6; hex 000000055817; asc     X ;;
  2: len 7; hex 2e0000018d1edf; asc .      ;;
  3: len 4; hex 80000065; asc    e;;
 
 *** WE ROLL BACK TRANSACTION (2)

從上面可以看出,MySQL可以檢測到死鎖,并通過回滾事務的方式來打破這種循環等待,但無論如何,在代碼中還是需要盡量減少或者避免死鎖的發生,可以嘗試通過以下方法來達到這樣的目的:

  • 讓事務盡可能的小且短;
  • 合理設置事務隔離級別;
  • 合理設置鎖等待超時時間;
  • 確定好事務操作的順序;
  • 創建合適的索引,減少加鎖的情況。

以上就是關于MySQL中的死鎖介紹。在實際編碼中,死鎖也是較為常見的一種錯誤,如果對于它不了解,那么碰到這種異常的時候就會顯得手足無措,希望本文有所幫助。

鳴謝:https://dev.mysql.com/doc/refman/5.7/en/

本文轉載自微信公眾號「互聯網全棧架構」,可以通過以下二維碼關注。轉載本文請聯系互聯網全棧架構公眾號。

責任編輯:武曉燕 來源: 互聯網全棧架構
相關推薦

2021-11-17 08:11:35

MySQL

2021-08-24 08:01:15

死鎖工具多線編程

2021-06-03 19:13:06

MySQLJson數據

2021-10-20 20:27:55

MySQL死鎖并發

2017-06-07 16:10:24

Mysql死鎖死鎖日志

2023-06-12 09:09:19

MySQLDDLNSTANT

2021-08-31 07:54:24

SQLDblink查詢

2024-04-26 00:00:00

Rust檢查器代碼

2023-09-13 14:52:11

MySQL數據庫

2021-06-08 08:38:36

MySQL數據庫死鎖問題

2021-10-30 19:56:10

Flutter按鈕 Buttons

2022-05-11 09:01:54

Swift類型系統幻象類型

2023-07-28 09:54:14

SQL數據Excel

2021-03-08 00:11:02

Spring注解開發

2022-07-04 08:54:39

Swift處理器項目

2022-08-03 08:11:58

數據測試同類型

2021-09-03 06:46:34

SQL分組集功能

2024-04-15 00:00:00

RabbitMQ死信隊列消息

2021-08-16 08:12:04

SQLMerge用法

2022-11-26 08:16:26

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 粉嫩国产精品一区二区在线观看 | 国产精品久久久久999 | 怡红院成人在线视频 | 97久久精品午夜一区二区 | www.精品一区 | 日韩国产一区二区三区 | 99re视频| 国产人成精品一区二区三 | 爱高潮www亚洲精品 中文字幕免费视频 | 狠狠操狠狠干 | 每日更新av | 91久久精品一区二区二区 | 97国产成人 | 中文字幕 在线观看 | 欧美在线国产精品 | 成人亚洲视频 | 亚洲在线| 成人一区二区三区在线观看 | 香蕉视频久久久 | 国产精品福利网站 | 久久精品一区 | 亚洲电影一区二区三区 | 国产美女一区二区 | 91久久久精品国产一区二区蜜臀 | 欧美激情精品久久久久 | 日本成人中文字幕 | 国产精品久久久久久久久久久久 | 日韩一区二区三区四区五区 | 欧美男人天堂 | 国产中文区二幕区2012 | 中文字幕亚洲一区二区三区 | 亚洲五码在线 | 狠狠狠色丁香婷婷综合久久五月 | 欧美综合精品 | a级免费视频 | 91色在线视频 | 欧美精品91 | 热99视频 | 综合色播 | 精品欧美一区二区三区精品久久 | www97影院 |