| ä½è çèµ·å¸ï¼è ¾è®¯CSIGæ°æ®åºäº§åä¸å¿åå°å¼åå·¥ç¨å¸ï¼ç®å主è¦åä¸DBbrainå¼åå·¥ä½ï¼çç±ææ¯ï¼æ¬¢è¿çè¨è¿è¡äº¤æµã
æ们é½ç¥éï¼æ°æ®åºç³»ç»ä¸ï¼ä¸å线ç¨å¹¶å访é®æ°æ®ï¼ä¸ºäºä¿æ¤æ°æ®ï¼å¨æ§è¡SQLè¯å¥æ¶åéè¦å¯¹æ°æ®å éãèæ»éæ¯ä¸ä¸ªç»å¸¸éå°é®é¢ï¼SQLè¯å¥å éåäºç©é离级å«ï¼è®¿é®çç´¢å¼æ¯ä¸æ¯å¯ä¸ï¼è®¿é®æ°æ®æ¯å¦åå¨é½æå ³ç³»ï¼å¾å¾æ»éåæé常å¤æãè¿ç¯æç« å°ä»ç»ä¸ä¸ªâç®åçæ»éâï¼è¿ä¸ªæ»é产ççäºç©ä¸SQLè¯å¥é½åªæä¸æ¡ï¼èä¸ä¸å¡é常ç®åå°±æ¯å é¤ä¸æ¡è®°å½ã两个äºç©åæ¶æ§è¡ä»¥ä¸ä¸¤ä¸ªSQLè¯å¥å°±æå¯è½æ»éã
DELETE FROM dept_manager WHERE num = 0;DELETE FROM dept_manager WHERE dept_no = 'd001';
å¤å¶
ä¸ãæ»é模æ
æ»é模æ
é¦å ä»ç»ä¸è¡¨ç»æï¼è¿ä¸ªè¡¨é¤äºä¸»é®ç´¢å¼ PRIMARYï¼è¿æä¸ä¸ªå¯ä¸ç´¢å¼ num åä¸ä¸ªéå¯ä¸ç´¢å¼ dept_no ï¼å»ºè¡¨è¯å¥å¦ä¸ï¼
CREATE TABLE `dept_manager` ( `emp_no` int(11) NOT NULL, `dept_no` char(4) NOT NULL, `num` int(11) NOT NULL, `to_date` date NOT NULL, PRIMARY KEY (`emp_no`), unique index(`num`), KEY `dept_no` (`dept_no`))Â ENGINE=InnoDBÂ DEFAULTÂ CHARSET=latin1;
å¤å¶
ç¶åååå¤ä¸æ°æ®ï¼
INSERT INTO `dept_manager` VALUES (1001,'d001',0,'1991-10-01'), (1002,'d005',1,'9999-01-01'), (1005,'d002',3,'1989-12-17'), (1007,'d002',4,'9999-01-01'), (1008,'d004',7,'1988-09-09'), (1009,'d004',8,'1992-08-02'),                                  (1010,'d005',9,'1996-08-30');
å¤å¶
使ç¨æ§è¡ä¸¤ä¸ªsqlå¾é¾ï¼ä½¿ç¨ mysqlslap æ¥é«å¹¶å碰碰è¿æ°ï¼
# mysqlslap --create-schema dldb -q "begin;DELETE FROM dept_manager WHERE num = 0; rollback;" --number-of-queries=100000 -uroot -p123456 &# mysqlslap --create-schema dldb -q "begin;DELETE FROM dept_manager WHERE dept_no = 'd001'; rollback;" --number-of-queries=100000 -uroot -p123456 &
å¤å¶
è¿ä¸¤ä¸ªäºç©é常é½æ¯å é¤ä¸è¡ç¸åçæ°æ® (1001,'d001',0,'1991-10-01'ï¼åªä¸è¿ä¸ä¸ªæ ¹æ®ç´¢å¼ num ï¼ä¸ä¸ªæ ¹æ®ç´¢å¼ dept_no ã
äºãåå åæ
1. æ°æ®æ¯æä¹æ¾å°çï¼
è¦è¯´æ¸ æ¥æ»é产çåå ï¼å°±è¦å çæ¸ æ¥è¿æ¡SQLæ¯æä¹æ§è¡çï¼ä¼å¨é£äºå°æ¹å éãå¨æ¤ä¹åå 说说æ°æ®åºæ¯æä¹æ¾å°æ们è¦å é¤çè¿è¡æ°æ®çãä¸é¢ä¸¤å¹ å¾å±ç¤ºæ ¹æ®å¹´é¾ä¸º30æ¥æ¥è®°å½ç示æå¾ãé¦å æ ¹æ® name 为 seven, å¨ name è¿ä¸ªè¾ å©ç´¢å¼æ¥æ¾ï¼ä½æ¯åªè½æ¿å°ä¸»é®ç idãéååæ ¹æ®ä¸»é®id å»ä¸»é®æ¥æ¾ï¼è¿ä¸ªè¿ç¨ç§°ä¸ºå表ã访é®æ°æ®æ¯è¦éè¿ç´¢å¼çï¼èä¸æ°æ®å°±å¨ä¸»é®ç´¢å¼ä¸é¢ï¼æ以å éå°±æ¯å å¨ç´¢å¼ä¸é¢çã
2. Delete æ¯æä¹æ§è¡ç
Delete å é¤æ°æ®å ¶å®å¹¶ä¸æ¯ææ°æ®å é¤äºï¼åªæ¯ææ°æ®æ è®°ä¸ä¸ï¼è¡¨ç¤ºè¿éå¯ä»¥å¤ç¨çï¼å¦æä¸æ¬¡è¿éææ°æ®è¦æå ¥å°±å¯ä»¥ç´æ¥å¤ç¨åæ¥ç©ºé´éãæ以Delete å Update æä½æ¯è¾ç±»ä¼¼ãDelete å Update æ¯æ ¹æ®æ¡ä»¶æ¾å°ç¬¬ä¸æ¡æ°æ®ï¼è¿è¡ä¿®æ¹ï¼ç¶åæ¾å°ç¬¬äºæ¡æ°æ®ï¼ä»¥æ¤ç±»æ¨ç´å°åä¹æ¥ä¸å°ç¬¦åæ¡ä»¶çæ°æ®ã
3. å éåæ
æ们以  DELETE FROM dept_manager WHERE num = 0; 为ä¾ï¼åªæä¸ä¸ªæ¡ä»¶ num = 0, å 该æ¯æ ¹æ® num = 0 å¨ num ç´¢å¼ä¸æ¾å°å¯¹åºç主é®id, éåæ ¹æ®ä¸»é® id,æ¾å°å¯¹åºè®°å½ï¼æ è®°æå¯å¤ç¨ç¶æãé¤äºå é¤æ°æ®è¡è®°å½ï¼å¯¹åºçç´¢å¼ä¹éè¦ç»´æ¤ä¸ï¼å ¶ä»ç´¢å¼å¯¹åºä½ç½®ä¹éè¦æ è®°æå é¤ç¶æãè¿ä¸ªè¡¨ä¸ä¸»é®ç´¢å¼ PRIMARYï¼å¯ä¸ç´¢å¼ numï¼éå¯ä¸ç´¢å¼ dept_no ç对åºä½ç½®é½ä¼å ä¸éãåç第äºä¸ªSQLè¯å¥æ§è¡æ¶åï¼å éä½ç½®ä¹æ¯ä¸æ ·çãï¼å¯éå¤åº¦é离级å«ä¸ï¼éå¯ä¸ç´¢å¼è¿è¦å ä¸é´ééï¼ã
æ¢ç¶å éä¸ä¸æ ·çï¼é£åºè¯¥æ¯å¨ä¸åç´¢å¼å é顺åºæ¯ä¸ä¸æ ·çãæ¨æµä¸å¯¹äº WHERE num = 0 åºè¯¥å å¨ num ä¸å éï¼éåå¨ä¸»é®å éï¼æåå¨ dept_noä¸ï¼num ->PRIMARY-> dept_noãWHERE dept_no = 'd001';å é顺åºåºè¯¥æ¯dept_no -> PRIMARY -> numã尽管è¿æ¡SQLæ°æ®å¾ç®åï¼ä½æ¯ç±äºæ°æ®ä¸ç´¢å¼æ¯è¾å¤ï¼å é顺åºä¹ä¸ä¸æ ·ï¼å¯¼è´äºæ»éã
ä¸ãåºæ¯éªè¯
å¯ä»¥ç¨ show engine innodb status ï¼æ¥æ¥çæè¿ä¸æ¬¡æ»éæ¥å¿ãäºç©1çå¾ ç´¢å¼deptä¸çé 0: len 4; hex 64303031; asc d001;; è¿éâ64303031â 16è¿å¶è½¬ä¸ºå符为âd001â ä¸ WHERE dept_no = 'd001' ç¸å¯¹åºãäºç©2ææè¿ä¸ªéçï¼äºç©1ææçé没ææ¾ç¤ºï¼åºè¯¥æ¯ä¸»é®ä¸çéï¼è¿æ¯ç¬¦åé¢æçã
------------------------LATEST DETECTED DEADLOCK------------------------2021-04-27 16:41:19 0x70000a6b1000*** (1) TRANSACTION:TRANSACTION 1681994, ACTIVE 0 sec updating or deletingmysql tables in use 1, locked 1LOCK WAIT 4 lock struct(s), heap size 1136, 3 row lock(s), undo log entries 1MySQL thread id 30, OS thread handle 123145456488448, query id 343687 localhost 127.0.0.1 root updatingDELETE FROM dept_manager WHERE num = 0*** (1) WAITING FOR THIS LOCK TO BE GRANTED: #è¯·æ± dept_noä¸éRECORD LOCKS space id 367 page no 5 n bits 80 index dept_no of table `employees`.`dept_manager` trx id 1681994 lock_mode X locks rec but not gap waitingRecord lock, heap no 2 PHYSICAL RECORD: n_fields 2; compact format; info bits 0 0: len 4; hex 64303031; asc d001;; 1: len 4; hex 800003e9; asc ;;
*** (2) TRANSACTION:TRANSACTION 1681554, ACTIVE 0 sec starting index readmysql tables in use 1, locked 13 lock struct(s), heap size 1136, 2 row lock(s)MySQL thread id 106, OS thread handle 123145477099520, query id 341105 localhost 127.0.0.1 root updatingDELETE FROM dept_manager WHERE dept_no = 'd001'*** (2) HOLDS THE LOCK(S): # ææ dept_no ä¸éRECORD LOCKS space id 367 page no 5 n bits 80 index dept_no of table `employees`.`dept_manager` trx id 1681554 lock_mode XRecord lock, heap no 2 PHYSICAL RECORD: n_fields 2; compact format; info bits 0 0: len 4; hex 64303031; asc d001;; 1: len 4; hex 800003e9; asc ;;
*** (2) WAITING FOR THIS LOCK TO BE GRANTED: # 请æ±ä¸»é®RECORD LOCKS space id 367 page no 3 n bits 80 index PRIMARY of table `employees`.`dept_manager` trx id 1681554 lock_mode X locks rec but not gap waitingRecord lock, heap no 2 PHYSICAL RECORD: n_fields 6; compact format; info bits 32 0: len 4; hex 800003e9; asc ;; 1: len 6; hex 00000019aa4a; asc J;; 2: len 7; hex 2c000001b80ede; asc , ;; 3: len 4; hex 64303031; asc d001;; 4: len 4; hex 80000000; asc ;; 5: len 3; hex 8f8f41; asc A;;
*** WE ROLL BACK TRANSACTION (2)
å¤å¶
åãæ»ç»
æ¬æä»ç»çæ ·ä¾ä¸ï¼å°½ç®¡SQLè¯å¥å¾ç®åï¼ä½ç±äºè¡¨ä¸æå¤ä¸ªç´¢å¼ï¼å¯¹ç´¢å¼ç访é®é¡ºåºä¸åï¼é ææ»éé£é©ã为äºé¿å æ°æ®åºä¸åçæ»éï¼å»ºè®®ï¼
1. å°½éå¼å¯æ»éæ£æµï¼
2. å°½é使ç¨å°äºå¡ï¼å¨ä¸å¡å 许èå´å ï¼å°é离级å«æ¹æ读已æ交ï¼å¯ä»¥åå°ä¸äºä¸å¿ è¦çéï¼
3. é¿å å ¨è¡¨æ«æï¼
4. é¿å è¾å¤ç´¢å¼ï¼
5. ä¸åäºå¡å¯¹è¡¨åè¡æä½ç顺åºå°½éä¸è´ã
- End -
 æ´å¤ç²¾å½©
ç»äºï¼è¿ä¸ªMySQLæ éå®ä½æ¹æ³å¤ªå¥½ç¨äº
æ°æ®åºè¯æä¸äºçï¼è ¾è®¯å¤§ç¥æ¥âè¯æâ
ââè¶ å¼äºæ°æ®åºç¹è¿å¿~