久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

mysql怎么防止死鎖

共計(jì) 3435 個(gè)字符,預(yù)計(jì)需要花費(fèi) 9 分鐘才能閱讀完成。

這篇文章主要介紹“mysql 怎么防止死鎖”,在日常操作中,相信很多人在 mysql 怎么防止死鎖問(wèn)題上存在疑惑,丸趣 TV 小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”mysql 怎么防止死鎖”的疑惑有所幫助!接下來(lái),請(qǐng)跟著丸趣 TV 小編一起來(lái)學(xué)習(xí)吧!

  死鎖是事務(wù)繞不開(kāi)的話題,mysql 當(dāng)然也不例外,本文主要模擬一下 mysql 的死鎖,以及應(yīng)對(duì)措施。
  首先看一個(gè)參數(shù),默認(rèn) innodb_print_all_deadlocks 參數(shù)是關(guān)閉。開(kāi)啟后可以將死鎖記錄到 error.log 中。否則只能通過(guò) show engine innodb status 查看。
mysql SHOW VARIABLES LIKE INNODB_PRINT_ALL_DEADLOCKS
+—————————-+——-+
| Variable_name  | Value |
+—————————-+——-+
| innodb_print_all_deadlocks | OFF  |
+—————————-+——-+
1 row in set (0.00 sec)

開(kāi)啟 innodb_print_all_deadlocks, 改參數(shù)是全局參數(shù),可以動(dòng)態(tài)調(diào)整。
mysql SET GLOBAL innodb_print_all_deadlocks=1;
Query OK, 0 rows affected (0.00 sec)

表 test01 上 c1 是主鍵,c2 是唯一約束。
mysql show create table test01\G
*************************** 1. row ***************************
  Table: test01
Create Table: CREATE TABLE `test01` (
  `c1` bigint(20) NOT NULL AUTO_INCREMENT,
  `c2` int(11) DEFAULT NULL,
  PRIMARY KEY (`c1`),
  UNIQUE KEY `uidx_test01_c2` (`c2`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8
1 row in set (0.00 sec)
mysql select * from test01;
+—-+——+
| c1 | c2  |
+—-+——+
|  1 |  1 |
|  2 |  2 |
|  3 |  3 |
+—-+——+
3 rows in set (0.00 sec)
會(huì)話 A
mysql begin ;
Query OK, 0 rows affected (0.00 sec)

mysql delete from test01 where c2=2;
Query OK, 1 row affected (0.00 sec)

會(huì)話 B
mysql begin;
Query OK, 0 rows affected (0.00 sec)

mysql delete from test01 where c2=2;
ERROR 1213 (40001): Deadlock found when trying to get lock; try restarting transaction

會(huì)話 A
mysql insert into test01 select 2,2;
Query OK, 1 row affected (0.00 sec)
Records: 1  Duplicates: 0  Warnings: 0
會(huì)話 A 在(2,2)上加了 X 的行鎖,會(huì)話 B 要?jiǎng)h除相同的數(shù)據(jù)行,那么也要在該行上加 X 的行鎖(lock_mode X locks rec but not gap),所以出現(xiàn)了等待(lock_mode X waiting)。后面會(huì)話 A 要插入一行(2,2),因?yàn)樽侄?c2 上有唯一索引,插入的時(shí)候要檢查 duplicate key 的檢查,這個(gè)過(guò)程需要申請(qǐng) S 的鎖,而在得到這個(gè)鎖之前,它需要等會(huì)話 B 先得到會(huì)話 A 最開(kāi)始執(zhí)行的 X 鎖。也就是說(shuō),會(huì)話 B 要等待會(huì)話 A 第一條語(yǔ)句釋放 X 鎖,會(huì)話 A 第二條語(yǔ)句又要等待會(huì)話 B 釋放 X 鎖,兩個(gè)會(huì)話之間形成了等待的閉合回路,形成了死鎖。出現(xiàn)死鎖后,mysql 會(huì)選擇一個(gè)小事務(wù)進(jìn)行回滾,以解決死鎖。
show engine innodb status 查看死鎖信息,error.log 中記錄的死鎖也類似下面:
————————
LATEST DETECTED DEADLOCK
————————
2019-07-18 11:11:32 0x7fdc50298700
*** (1) TRANSACTION:
TRANSACTION 713521, ACTIVE 122 sec starting index read
mysql tables in use 1, locked 1
LOCK WAIT 2 lock struct(s), heap size 1136, 2 row lock(s)
MySQL thread id 4, OS thread handle 140584214165248, query id 144 localhost root updating
delete from test01 where c2=2
*** (1) WAITING FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS space id 25 page no 4 n bits 72 index uidx_test01_c2 of table `ming`.`test01` trx id 713521 lock_mode X waiting
Record lock, heap no 3 PHYSICAL RECORD: n_fields 2; compact format; info bits 32
 0: len 4; hex 80000002; asc  ;;
 1: len 8; hex 8000000000000002; asc  ;;

*** (2) TRANSACTION:
TRANSACTION 713523, ACTIVE 16 sec inserting
mysql tables in use 1, locked 1
4 lock struct(s), heap size 1136, 3 row lock(s), undo log entries 2
MySQL thread id 3, OS thread handle 140584214431488, query id 146 localhost root executing
insert into test01 select 2,2
*** (2) HOLDS THE LOCK(S):
RECORD LOCKS space id 25 page no 4 n bits 72 index uidx_test01_c2 of table `ming`.`test01` trx id 713523 lock_mode X locks rec but not gap
Record lock, heap no 3 PHYSICAL RECORD: n_fields 2; compact format; info bits 32
 0: len 4; hex 80000002; asc  ;;
 1: len 8; hex 8000000000000002; asc  ;;

*** (2) WAITING FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS space id 25 page no 4 n bits 72 index uidx_test01_c2 of table `ming`.`test01` trx id 713523 lock mode S waiting
Record lock, heap no 3 PHYSICAL RECORD: n_fields 2; compact format; info bits 32
 0: len 4; hex 80000002; asc  ;;
 1: len 8; hex 8000000000000002; asc  ;;

針對(duì)死鎖的舉措:
1. 如果死鎖較多的話,那么建議開(kāi)啟 innodb_print_all_deadlocks, 因?yàn)?show engine innodb status 只顯示最近一次的死鎖信息。
2. 保持事務(wù)小而短,并盡快提價(jià)
3. 避免在一個(gè)事務(wù)里面修改幾張表,或者是同一張表修改不同的結(jié)果集
4. 可以嘗試使用較低的隔離級(jí)別,比如 RC。也可以使用鎖定讀
5. 建立合適的索引
6. 如果應(yīng)用允許的話,串行化事務(wù)

到此,關(guān)于“mysql 怎么防止死鎖”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注丸趣 TV 網(wǎng)站,丸趣 TV 小編會(huì)繼續(xù)努力為大家?guī)?lái)更多實(shí)用的文章!

正文完
 
丸趣
版權(quán)聲明:本站原創(chuàng)文章,由 丸趣 2023-08-01發(fā)表,共計(jì)3435字。
轉(zhuǎn)載說(shuō)明:除特殊說(shuō)明外本站除技術(shù)相關(guān)以外文章皆由網(wǎng)絡(luò)搜集發(fā)布,轉(zhuǎn)載請(qǐng)注明出處。
評(píng)論(沒(méi)有評(píng)論)
主站蜘蛛池模板: 白山市| 蓬莱市| 海伦市| 普洱| 罗城| 宁夏| 双牌县| 南雄市| 百色市| 白山市| 红原县| 西丰县| 安龙县| 蒲江县| 牙克石市| 陇川县| 淳安县| 桂东县| 清新县| 枣强县| 肇东市| 郎溪县| 南岸区| 呈贡县| 织金县| 德昌县| 同德县| 敦煌市| 湘西| 永昌县| 阿鲁科尔沁旗| 晴隆县| 武夷山市| 文成县| 木兰县| 昌吉市| 慈利县| 农安县| 景宁| 建湖县| 当雄县|