## MySQL åºç¡ ### å ³ç³»åæ°æ®åºä»ç» 顾åæä¹ï¼å ³ç³»åæ°æ®åºå°±æ¯ä¸ç§å»ºç«å¨å ³ç³»æ¨¡åçåºç¡ä¸çæ°æ®åºãå ³ç³»æ¨¡å表æäºæ°æ®åºä¸æåå¨çæ°æ®ä¹é´çèç³»ï¼ä¸å¯¹ä¸ãä¸å¯¹å¤ãå¤å¯¹å¤ï¼ã å ³ç³»åæ°æ®åºä¸ï¼æä»¬çæ°æ®é½è¢«åæ¾å¨äºåç§è¡¨ä¸ï¼æ¯å¦ç¨æ·è¡¨ï¼ï¼è¡¨ä¸çæ¯ä¸è¡å°±åæ¾ç䏿¡æ°æ®ï¼æ¯å¦ä¸ä¸ªç¨æ·çä¿¡æ¯ï¼ã  大é¨åå ³ç³»åæ°æ®åºé½ä½¿ç¨ SQL æ¥æä½æ°æ®åºä¸çæ°æ®ãå¹¶ä¸ï¼å¤§é¨åå ³ç³»åæ°æ®åºé½æ¯æäºå¡çåå¤§ç¹æ§(ACID)ã **æåªäºå¸¸è§çå ³ç³»åæ°æ®åºå¢ï¼** MySQLãPostgreSQLãOracleãSQL ServerãSQLiteï¼å¾®ä¿¡æ¬å°çè天记å½çåå¨å°±æ¯ç¨ç SQLiteï¼ ......ã ### MySQL ä»ç»  **MySQL æ¯ä¸ç§å ³ç³»åæ°æ®åºï¼ä¸»è¦ç¨äºæä¹ åå卿们çç³»ç»ä¸çä¸äºæ°æ®æ¯å¦ç¨æ·ä¿¡æ¯ã** ç±äº MySQL æ¯å¼æºå è´¹å¹¶ä¸æ¯è¾æççæ°æ®åºï¼å æ¤ï¼MySQL 被大é使ç¨å¨åç§ç³»ç»ä¸ãä»»ä½äººé½å¯ä»¥å¨ GPL(General Public License) ç许å¯ä¸ä¸è½½å¹¶æ ¹æ®ä¸ªæ§åçéè¦å¯¹å ¶è¿è¡ä¿®æ¹ãMySQL çé»è®¤ç«¯å£å·æ¯**3306**ã ## åå¨å¼æ ### åå¨å¼æç¸å ³çå½ä»¤ **æ¥ç MySQL æä¾çææåå¨å¼æ** ```sql mysql> show engines; ```  ä»ä¸å¾æä»¬å¯ä»¥æ¥çåº MySQL å½åé»è®¤çåå¨å¼ææ¯ InnoDBï¼å¹¶ä¸å¨ 5.7 çæ¬ææçåå¨å¼æä¸åªæ InnoDB æ¯äºå¡æ§åå¨å¼æï¼ä¹å°±æ¯è¯´åªæ InnoDB æ¯æäºå¡ã **æ¥ç MySQL å½åé»è®¤çåå¨å¼æ** æä»¬ä¹å¯ä»¥éè¿ä¸é¢çå½ä»¤æ¥çé»è®¤çåå¨å¼æã ```sql mysql> show variables like '%storage_engine%'; ``` **æ¥ç表çåå¨å¼æ** ```sql show table status like "table_name" ; ```  ### MyISAM å InnoDB çåºå«  MySQL 5.5 ä¹åï¼MyISAM å¼ææ¯ MySQL çé»è®¤åå¨å¼æï¼å¯è°æ¯é£å 䏿¶ã è½ç¶ï¼MyISAM çæ§è½è¿è¡ï¼åç§ç¹æ§ä¹è¿ä¸éï¼æ¯å¦å ¨æç´¢å¼ãå缩ã空é´å½æ°çï¼ã使¯ï¼MyISAM 䏿¯æäºå¡åè¡çº§éï¼è䏿大ç缺é·å°±æ¯å´©æºåæ æ³å®å ¨æ¢å¤ã 5.5 çæ¬ä¹åï¼MySQL å¼å ¥äº InnoDBï¼äºå¡æ§æ°æ®åºå¼æï¼ï¼MySQL 5.5 çæ¬åé»è®¤çåå¨å¼æä¸º InnoDBãå°ä¼åï¼ä¸å®è¦è®°å¥½è¿ä¸ª InnoDB ï¼ä½ æ¯æ¬¡ä½¿ç¨ MySQL æ°æ®åºé½æ¯ç¨çè¿ä¸ªåå¨å¼æå§ï¼ è¨å½æ£ä¼ ï¼å±ä»¬ä¸é¢è¿æ¯æ¥ç®å对æ¯ä¸ä¸ä¸¤è ï¼ **1.æ¯å¦æ¯æè¡çº§é** MyISAM åªæè¡¨çº§é(table-level locking)ï¼è InnoDB æ¯æè¡çº§é(row-level locking)å表级é,é»è®¤ä¸ºè¡çº§éã ä¹å°±è¯´ï¼MyISAM ä¸éå°±æ¯éä½äºæ´å¼ 表ï¼è¿å¨å¹¶ååçæ åµä¸æ¯å¤ä¹æ»´æ¨æ¨åï¼è¿ä¹æ¯ä¸ºä»ä¹ InnoDB å¨å¹¶ååçæ¶åï¼æ§è½æ´çç®äºï¼ **2.æ¯å¦æ¯æäºå¡** MyISAM 䏿ä¾äºå¡æ¯æã InnoDB æä¾äºå¡æ¯æï¼å ·ææäº¤(commit)ååæ»(rollback)äºå¡çè½åã **3.æ¯å¦æ¯æå¤é®** MyISAM 䏿¯æï¼è InnoDB æ¯æã ð æå±ä¸ä¸ï¼ ä¸è¬æä»¬ä¹æ¯ä¸å»ºè®®å¨æ°æ®åºå±é¢ä½¿ç¨å¤é®çï¼åºç¨å±é¢å¯ä»¥è§£å³ãä¸è¿ï¼è¿æ ·ä¼å¯¹æ°æ®çä¸è´æ§é æå¨èãå ·ä½è¦ä¸è¦ä½¿ç¨å¤é®è¿æ¯è¦æ ¹æ®ä½ çé¡¹ç®æ¥å³å®ã **4.æ¯å¦æ¯ææ°æ®åºå¼å¸¸å´©æºåçå®å ¨æ¢å¤** MyISAM 䏿¯æï¼è InnoDB æ¯æã ä½¿ç¨ InnoDB çæ°æ®åºå¨å¼å¸¸å´©æºåï¼æ°æ®åºéæ°å¯å¨çæ¶åä¼ä¿è¯æ°æ®åºæ¢å¤å°å´©æºåçç¶æãè¿ä¸ªæ¢å¤çè¿ç¨ä¾èµäº `redo log` ã ð æå±ä¸ä¸ï¼ - MySQL InnoDB å¼æä½¿ç¨ **redo log(é忥å¿)** ä¿è¯äºå¡ç**æä¹ æ§**ï¼ä½¿ç¨ **undo log(åæ»æ¥å¿)** æ¥ä¿è¯äºå¡ç**ååæ§**ã - MySQL InnoDB 弿éè¿ **éæºå¶**ã**MVCC** çææ®µæ¥ä¿è¯äºå¡çé离æ§ï¼ é»è®¤æ¯æçéç¦»çº§å«æ¯ **`REPEATABLE-READ`** ï¼ã - ä¿è¯äºäºå¡çæä¹ æ§ãååæ§ãé离æ§ä¹åï¼ä¸è´æ§æè½å¾å°ä¿éã **5.æ¯å¦æ¯æ MVCC** MyISAM 䏿¯æï¼è InnoDB æ¯æã 讲çï¼è¿ä¸ªå¯¹æ¯æç¹åºè¯ï¼æ¯ç« MyISAM è¿è¡çº§éé½ä¸æ¯æã MVCC å¯ä»¥ç使¯è¡çº§éçä¸ä¸ªå级ï¼å¯ä»¥ææåå°å éæä½ï¼æä¾æ§è½ã ### å ³äº MyISAM å InnoDB çéæ©é®é¢ 大夿°æ¶åæä»¬ä½¿ç¨ç齿¯ InnoDB åå¨å¼æï¼å¨æäºè¯»å¯éçæ åµä¸ï¼ä½¿ç¨ MyISAM 乿¯åéçãä¸è¿ï¼åææ¯ä½ ç项ç®ä¸ä»æ MyISAM 䏿¯æäºå¡ãå´©æºæ¢å¤ç缺ç¹ï¼å¯æ¯~æä»¬ä¸è¬é½ä¼ä»æåï¼ï¼ã ãMySQL 髿§è½ãä¸é¢æä¸å¥è¯è¿æ ·åå°: > ä¸è¦è½»æç¸ä¿¡âMyISAM æ¯ InnoDB å¿«âä¹ç±»çç»éªä¹è°ï¼è¿ä¸ªç»è®ºå¾å¾ä¸æ¯ç»å¯¹çãå¨å¾å¤æä»¬å·²ç¥åºæ¯ä¸ï¼InnoDB çé度é½å¯ä»¥è®© MyISAM æå°è«åï¼å°¤å ¶æ¯ç¨å°äºèç°ç´¢å¼ï¼æè éè¦è®¿é®çæ°æ®é½å¯ä»¥æ¾å ¥å åçåºç¨ã ä¸è¬æ åµä¸æä»¬éæ© InnoDB 齿¯æ²¡æé®é¢çï¼ä½æ¯æäºæ åµä¸ä½ å¹¶ä¸å¨ä¹å¯æ©å±è½ååå¹¶åè½åï¼ä¹ä¸éè¦äºå¡æ¯æï¼ä¹ä¸å¨ä¹å´©æºåçå®å ¨æ¢å¤é®é¢çè¯ï¼éæ© MyISAM 乿¯ä¸ä¸ªä¸éçéæ©ã使¯ä¸è¬æ åµä¸ï¼æä»¬é½æ¯éè¦èèå°è¿äºé®é¢çã å æ¤ï¼å¯¹äºå±ä»¬æ¥å¸¸å¼åçä¸å¡ç³»ç»æ¥è¯´ï¼ä½ å 乿¾ä¸å°ä»ä¹çç±åä½¿ç¨ MyISAM ä½ä¸ºèªå·±ç MySQL æ°æ®åºçåå¨å¼æã ## éæºå¶ä¸ InnoDB éç®æ³ **MyISAM å InnoDB åå¨å¼æä½¿ç¨çéï¼** - MyISAM éç¨è¡¨çº§é(table-level locking)ã - InnoDB æ¯æè¡çº§é(row-level locking)å表级é,é»è®¤ä¸ºè¡çº§é **表级éåè¡çº§é对æ¯ï¼** - **表级éï¼** MySQL ä¸éå® **ç²åº¦æå¤§** çä¸ç§éï¼å¯¹å½åæä½çæ´å¼ 表å éï¼å®ç°ç®åï¼èµæºæ¶è乿¯è¾å°ï¼å éå¿«ï¼ä¸ä¼åºç°æ»éãå ¶éå®ç²åº¦æå¤§ï¼è§¦åéå²çªçæ¦çæé«ï¼å¹¶å度æä½ï¼MyISAM å InnoDB 弿齿¯æè¡¨çº§éã - **è¡çº§éï¼** MySQL ä¸éå® **ç²åº¦æå°** çä¸ç§éï¼åªé对å½åæä½çè¡è¿è¡å éã è¡çº§éè½å¤§å¤§åå°æ°æ®åºæä½çå²çªãå ¶å éç²åº¦æå°ï¼å¹¶å度é«ï¼ä½å éçå¼é乿大ï¼å éæ ¢ï¼ä¼åºç°æ»éã **InnoDB åå¨å¼æçéçç®æ³æä¸ç§ï¼** - Record lockï¼è®°å½éï¼å个è¡è®°å½ä¸çé - Gap lockï¼é´ééï¼éå®ä¸ä¸ªèå´ï¼ä¸å æ¬è®°å½æ¬èº« - Next-key lockï¼record+gap临é®éï¼éå®ä¸ä¸ªèå´ï¼å å«è®°å½æ¬èº« ## æ¥è¯¢ç¼å æ§è¡æ¥è¯¢è¯å¥çæ¶åï¼ä¼å æ¥è¯¢ç¼åãä¸è¿ï¼MySQL 8.0 çæ¬åç§»é¤ï¼å 为è¿ä¸ªåè½ä¸å¤ªå®ç¨ `my.cnf` å å ¥ä»¥ä¸é ç½®ï¼éå¯ MySQL å¼å¯æ¥è¯¢ç¼å ```properties query_cache_type=1 query_cache_size=600000 ``` MySQL æ§è¡ä»¥ä¸å½ä»¤ä¹å¯ä»¥å¼å¯æ¥è¯¢ç¼å ```properties set global query_cache_type=1; set global query_cache_size=600000; ``` å¦ä¸ï¼**å¼å¯æ¥è¯¢ç¼ååå¨åæ ·çæ¥è¯¢æ¡ä»¶ä»¥åæ°æ®æ åµä¸ï¼ä¼ç´æ¥å¨ç¼åä¸è¿åç»æ**ãè¿éçæ¥è¯¢æ¡ä»¶å æ¬æ¥è¯¢æ¬èº«ãå½åè¦æ¥è¯¢çæ°æ®åºã客æ·ç«¯åè®®çæ¬å·çä¸äºå¯è½å½±åç»æçä¿¡æ¯ãå æ¤ä»»ä½ä¸¤ä¸ªæ¥è¯¢å¨ä»»ä½å符ä¸çä¸åé½ä¼å¯¼è´ç¼åä¸å½ä¸ãæ¤å¤ï¼å¦ææ¥è¯¢ä¸å å«ä»»ä½ç¨æ·èªå®ä¹å½æ°ãåå¨å½æ°ãç¨æ·åéã临æ¶è¡¨ãMySQL åºä¸çç³»ç»è¡¨ï¼å ¶æ¥è¯¢ç»æä¹ä¸ä¼è¢«ç¼åã ç¼å建ç«ä¹åï¼MySQL çæ¥è¯¢ç¼åç³»ç»ä¼è·è¸ªæ¥è¯¢ä¸æ¶åçæ¯å¼ è¡¨ï¼å¦æè¿äºè¡¨ï¼æ°æ®æç»æï¼åçååï¼é£ä¹åè¿å¼ 表ç¸å ³çææç¼åæ°æ®é½å°å¤±æã **ç¼åè½ç¶è½å¤æåæ°æ®åºçæ¥è¯¢æ§è½ï¼ä½æ¯ç¼ååæ¶ä¹å¸¦æ¥äºé¢å¤çå¼éï¼æ¯æ¬¡æ¥è¯¢åé½è¦å䏿¬¡ç¼åæä½ï¼å¤±æåè¿è¦éæ¯ã** å æ¤ï¼å¼å¯æ¥è¯¢ç¼åè¦è°¨æ ï¼å°¤å ¶å¯¹äºåå¯éçåºç¨æ¥è¯´æ´æ¯å¦æ¤ã妿å¼å¯ï¼è¦æ³¨æåçæ§å¶ç¼å空é´å¤§å°ï¼ä¸è¬æ¥è¯´å ¶å¤§å°è®¾ç½®ä¸ºå å MB æ¯è¾åéãæ¤å¤ï¼**è¿å¯ä»¥éè¿ sql_cache å sql_no_cache æ¥æ§å¶æä¸ªæ¥è¯¢è¯å¥æ¯å¦éè¦ç¼åï¼** ```sql select sql_no_cache count(*) from usr; ``` ## äºå¡ ### ä½ä¸ºäºå¡ï¼ ä¸è¨è½ä¹ï¼**äºå¡æ¯é»è¾ä¸çä¸ç»æä½ï¼è¦ä¹é½æ§è¡ï¼è¦ä¹é½ä¸æ§è¡ã** **å¯ä»¥ç®å举ä¸ä¸ªä¾åä¸ï¼** äºå¡æç»å ¸ä¹ç»å¸¸è¢«æ¿åºæ¥è¯´ä¾åå°±æ¯è½¬è´¦äºãåå¦å°æè¦ç»å°çº¢è½¬è´¦ 1000 å ï¼è¿ä¸ªè½¬è´¦ä¼æ¶åå°ä¸¤ä¸ªå ³é®æä½å°±æ¯ï¼ 1. å°å°æçä½é¢åå° 1000 å 2. å°å°çº¢çä½é¢å¢å 1000 å ã äºå¡ä¼æè¿ä¸¤ä¸ªæä½å°±å¯ä»¥çæé»è¾ä¸çä¸ä¸ªæ´ä½ï¼è¿ä¸ªæ´ä½å å«çæä½è¦ä¹é½æåï¼è¦ä¹é½è¦å¤±è´¥ã è¿æ ·å°±ä¸ä¼åºç°å°æä½é¢åå°èå°çº¢çä½é¢å´å¹¶æ²¡æå¢å çæ åµã ### ä½ä¸ºæ°æ®åºäºå¡ï¼ æ°æ®åºäºå¡å¨æä»¬æ¥å¸¸å¼å䏿¥è§¦çæå¤äºãå¦æä½ ç项ç®å±äºå使¶æçè¯ï¼ä½ æ¥è§¦å°çå¾å¾å°±æ¯æ°æ®åºäºå¡äºã å¹³æ¶ï¼æä»¬å¨è°è®ºäºå¡çæ¶åï¼å¦ææ²¡æç¹æ**åå¸å¼äºå¡**ï¼å¾å¾æçå°±æ¯**æ°æ®åºäºå¡**ã **飿°æ®åºäºå¡æä»ä¹ä½ç¨å¢ï¼** ç®åæ¥è¯´ï¼æ°æ®åºäºå¡å¯ä»¥ä¿è¯å¤ä¸ªå¯¹æ°æ®åºçæä½ï¼ä¹å°±æ¯ SQL è¯å¥ï¼ææä¸ä¸ªé»è¾ä¸çæ´ä½ãææè¿ä¸ªé»è¾ä¸çæ´ä½çè¿äºæ°æ®åºæä½éµå¾ªï¼**è¦ä¹å ¨é¨æ§è¡æå,è¦ä¹å ¨é¨ä¸æ§è¡** ã ```sql # å¼å¯ä¸ä¸ªäºå¡ START TRANSACTION; # 夿¡ SQL è¯å¥ SQL1,SQL2... ## æäº¤äºå¡ COMMIT; ```  å¦å¤ï¼å ³ç³»åæ°æ®åºï¼ä¾å¦ï¼`MySQL`ã`SQL Server`ã`Oracle` çï¼äºå¡é½æ **ACID** ç¹æ§ï¼  ### ä½ä¸º ACID ç¹æ§å¢ï¼ 1. **ååæ§**ï¼`Atomicity`ï¼ ï¼ äºå¡æ¯æå°çæ§è¡åä½ï¼ä¸å 许åå²ãäºå¡çååæ§ç¡®ä¿å¨ä½è¦ä¹å ¨é¨å®æï¼è¦ä¹å®å ¨ä¸èµ·ä½ç¨ï¼ 2. **ä¸è´æ§**ï¼`Consistency`ï¼ï¼ æ§è¡äºå¡ååï¼æ°æ®ä¿æä¸è´ï¼ä¾å¦è½¬è´¦ä¸å¡ä¸ï¼æ 论äºå¡æ¯å¦æåï¼è½¬è´¦è åæ¶æ¬¾äººçæ»é¢åºè¯¥æ¯ä¸åçï¼ 3. **é离æ§**ï¼`Isolation`ï¼ï¼ å¹¶åè®¿é®æ°æ®åºæ¶ï¼ä¸ä¸ªç¨æ·çäºå¡ä¸è¢«å ¶ä»äºå¡æå¹²æ°ï¼åå¹¶åäºå¡ä¹é´æ°æ®åºæ¯ç¬ç«çï¼ 4. **æä¹ æ§**ï¼`Durabilily`ï¼ï¼ ä¸ä¸ªäºå¡è¢«æäº¤ä¹åãå®å¯¹æ°æ®åºä¸æ°æ®çæ¹åæ¯æä¹ çï¼å³ä½¿æ°æ®åºåçæ éä¹ä¸åºè¯¥å¯¹å ¶æä»»ä½å½±åã **æ°æ®äºå¡çå®ç°åçå¢ï¼** æä»¬è¿é以 MySQL ç InnoDB å¼æä¸ºä¾æ¥ç®å说ä¸ä¸ã MySQL InnoDB å¼æä½¿ç¨ **redo log(é忥å¿)** ä¿è¯äºå¡ç**æä¹ æ§**ï¼ä½¿ç¨ **undo log(åæ»æ¥å¿)** æ¥ä¿è¯äºå¡ç**ååæ§**ã MySQL InnoDB 弿éè¿ **éæºå¶**ã**MVCC** çææ®µæ¥ä¿è¯äºå¡çé离æ§ï¼ é»è®¤æ¯æçéç¦»çº§å«æ¯ **`REPEATABLE-READ`** ï¼ã ä¿è¯äºäºå¡çæä¹ æ§ãååæ§ãé离æ§ä¹åï¼ä¸è´æ§æè½å¾å°ä¿éã ### å¹¶åäºå¡å¸¦æ¥åªäºé®é¢? å¨å ¸åçåºç¨ç¨åºä¸ï¼å¤ä¸ªäºå¡å¹¶åè¿è¡ï¼ç»å¸¸ä¼æä½ç¸åçæ°æ®æ¥å®æåèªçä»»å¡ï¼å¤ä¸ªç¨æ·å¯¹å䏿°æ®è¿è¡æä½ï¼ãå¹¶åè½ç¶æ¯å¿ é¡»çï¼ä½å¯è½ä¼å¯¼è´ä»¥ä¸çé®é¢ã - **è读ï¼Dirty readï¼:** å½ä¸ä¸ªäºå¡æ£å¨è®¿é®æ°æ®å¹¶ä¸å¯¹æ°æ®è¿è¡äºä¿®æ¹ï¼èè¿ç§ä¿®æ¹è¿æ²¡ææäº¤å°æ°æ®åºä¸ï¼è¿æ¶å¦å¤ä¸ä¸ªäºå¡ä¹è®¿é®äºè¿ä¸ªæ°æ®ï¼ç¶å使ç¨äºè¿ä¸ªæ°æ®ãå 为è¿ä¸ªæ°æ®æ¯è¿æ²¡ææäº¤çæ°æ®ï¼é£ä¹å¦å¤ä¸ä¸ªäºå¡è¯»å°çè¿ä¸ªæ°æ®æ¯âèæ°æ®âï¼ä¾æ®âèæ°æ®âæåçæä½å¯è½æ¯ä¸æ£ç¡®çã - **丢失修æ¹ï¼Lost to modifyï¼:** æå¨ä¸ä¸ªäºå¡è¯»åä¸ä¸ªæ°æ®æ¶ï¼å¦å¤ä¸ä¸ªäºå¡ä¹è®¿é®äºè¯¥æ°æ®ï¼é£ä¹å¨ç¬¬ä¸ä¸ªäºå¡ä¸ä¿®æ¹äºè¿ä¸ªæ°æ®åï¼ç¬¬äºä¸ªäºå¡ä¹ä¿®æ¹äºè¿ä¸ªæ°æ®ãè¿æ ·ç¬¬ä¸ä¸ªäºå¡å çä¿®æ¹ç»æå°±è¢«ä¸¢å¤±ï¼å æ¤ç§°ä¸ºä¸¢å¤±ä¿®æ¹ã ä¾å¦ï¼äºå¡ 1 读åæè¡¨ä¸çæ°æ® A=20ï¼äºå¡ 2 ä¹è¯»å A=20ï¼äºå¡ 1 ä¿®æ¹ A=A-1ï¼äºå¡ 2 ä¹ä¿®æ¹ A=A-1ï¼æç»ç»æ A=19ï¼äºå¡ 1 çä¿®æ¹è¢«ä¸¢å¤±ã - **ä¸å¯éå¤è¯»ï¼Unrepeatable readï¼:** æå¨ä¸ä¸ªäºå¡å 夿¬¡è¯»å䏿°æ®ãå¨è¿ä¸ªäºå¡è¿æ²¡æç»ææ¶ï¼å¦ä¸ä¸ªäºå¡ä¹è®¿é®è¯¥æ°æ®ãé£ä¹ï¼å¨ç¬¬ä¸ä¸ªäºå¡ä¸çä¸¤æ¬¡è¯»æ°æ®ä¹é´ï¼ç±äºç¬¬äºä¸ªäºå¡çä¿®æ¹å¯¼è´ç¬¬ä¸ä¸ªäºå¡ä¸¤æ¬¡è¯»åçæ°æ®å¯è½ä¸å¤ªä¸æ ·ãè¿å°±åçäºå¨ä¸ä¸ªäºå¡å 两次读å°çæ°æ®æ¯ä¸ä¸æ ·çæ åµï¼å æ¤ç§°ä¸ºä¸å¯éå¤è¯»ã - **幻读ï¼Phantom readï¼:** 幻读ä¸ä¸å¯éå¤è¯»ç±»ä¼¼ãå®åçå¨ä¸ä¸ªäºå¡ï¼T1ï¼è¯»åäºå è¡æ°æ®ï¼æ¥çå¦ä¸ä¸ªå¹¶åäºå¡ï¼T2ï¼æå ¥äºä¸äºæ°æ®æ¶ãå¨éåçæ¥è¯¢ä¸ï¼ç¬¬ä¸ä¸ªäºå¡ï¼T1ï¼å°±ä¼åç°å¤äºä¸äºåæ¬ä¸åå¨çè®°å½ï¼å°±å¥½ååçäºå¹»è§ä¸æ ·ï¼æä»¥ç§°ä¸ºå¹»è¯»ã **ä¸å¯éå¤è¯»å幻读åºå«ï¼** ä¸å¯éå¤è¯»çéç¹æ¯ä¿®æ¹æ¯å¦å¤æ¬¡è¯»å䏿¡è®°å½åç°å ¶ä¸æäºåçå¼è¢«ä¿®æ¹ï¼å¹»è¯»çéç¹å¨äºæ°å¢æè å 餿¯å¦å¤æ¬¡è¯»å䏿¡è®°å½åç°è®°å½å¢å¤æåå°äºã ### äºå¡éç¦»çº§å«æåªäº? SQL æ åå®ä¹äºå个é离级å«ï¼ - **READ-UNCOMMITTED(è¯»åæªæäº¤)ï¼** æä½çé离级å«ï¼å 许读åå°æªæäº¤çæ°æ®åæ´ï¼**å¯è½ä¼å¯¼è´è读ã幻读æä¸å¯éå¤è¯»**ã - **READ-COMMITTED(读åå·²æäº¤)ï¼** å 许读åå¹¶åäºå¡å·²ç»æäº¤çæ°æ®ï¼**å¯ä»¥é»æ¢è读ï¼ä½æ¯å¹»è¯»æä¸å¯éå¤è¯»ä»æå¯è½åç**ã - **REPEATABLE-READ(å¯éå¤è¯»)ï¼** 对åä¸å段ç夿¬¡è¯»åç»æé½æ¯ä¸è´çï¼é¤éæ°æ®æ¯è¢«æ¬èº«äºå¡èªå·±æä¿®æ¹ï¼**å¯ä»¥é»æ¢è读åä¸å¯éå¤è¯»ï¼ä½å¹»è¯»ä»æå¯è½åç**ã - **SERIALIZABLE(å¯ä¸²è¡å)ï¼** æé«çé离级å«ï¼å®å ¨æä» ACID çé离级å«ãææçäºå¡ä¾æ¬¡é个æ§è¡ï¼è¿æ ·äºå¡ä¹é´å°±å®å ¨ä¸å¯è½äº§çå¹²æ°ï¼ä¹å°±æ¯è¯´ï¼**该级å«å¯ä»¥é²æ¢è读ãä¸å¯éå¤è¯»ä»¥å幻读**ã --- | éç¦»çº§å« | è读 | ä¸å¯éå¤è¯» | 幻读 | | :--------------: | :--: | :--------: | :--: | | READ-UNCOMMITTED | â | â | â | | READ-COMMITTED | à | â | â | | REPEATABLE-READ | à | à | â | | SERIALIZABLE | à | à | à | ### MySQL çé»è®¤éç¦»çº§å«æ¯ä»ä¹? MySQL InnoDB åå¨å¼æçé»è®¤æ¯æçéç¦»çº§å«æ¯ **REPEATABLE-READï¼å¯é读ï¼**ãæä»¬å¯ä»¥éè¿`SELECT @@tx_isolation;`å½ä»¤æ¥æ¥çï¼MySQL 8.0 该å½ä»¤æ¹ä¸º`SELECT @@transaction_isolation;` ```sql mysql> SELECT @@tx_isolation; +-----------------+ | @@tx_isolation | +-----------------+ | REPEATABLE-READ | +-----------------+ ``` ~~è¿ééè¦æ³¨æçæ¯ï¼ä¸ SQL æ åä¸åçå°æ¹å¨äº InnoDB åå¨å¼æå¨ **REPEATABLE-READï¼å¯é读ï¼** äºå¡é离级å«ä¸ä½¿ç¨çæ¯ Next-Key Lock éç®æ³ï¼å æ¤å¯ä»¥é¿å 幻读ç产çï¼è¿ä¸å ¶ä»æ°æ®åºç³»ç»(å¦ SQL Server)æ¯ä¸åçãæä»¥è¯´ InnoDB åå¨å¼æçé»è®¤æ¯æçéç¦»çº§å«æ¯ **REPEATABLE-READï¼å¯é读ï¼** å·²ç»å¯ä»¥å®å ¨ä¿è¯äºå¡çé离æ§è¦æ±ï¼å³è¾¾å°äº SQL æ åç **SERIALIZABLE(å¯ä¸²è¡å)** é离级å«ã~~ ð é®é¢æ´æ£ï¼**MySQL InnoDB ç REPEATABLE-READï¼å¯é读ï¼å¹¶ä¸ä¿è¯é¿å 幻读ï¼éè¦åºç¨ä½¿ç¨å é读æ¥ä¿è¯ãèè¿ä¸ªå é度使ç¨å°çæºå¶å°±æ¯ Next-Key Locksã** å 为é离级å«è¶ä½ï¼äºå¡è¯·æ±çéè¶å°ï¼æä»¥å¤§é¨åæ°æ®åºç³»ç»çé离级å«é½æ¯ **READ-COMMITTED(读åæäº¤å 容)** ï¼ä½æ¯ä½ è¦ç¥éçæ¯ InnoDB åå¨å¼æé»è®¤ä½¿ç¨ **REPEATABLE-READï¼å¯é读ï¼** å¹¶ä¸ä¼æä»»ä½æ§è½æå¤±ã InnoDB åå¨å¼æå¨ **åå¸å¼äºå¡** çæ åµä¸ä¸è¬ä¼ç¨å° **SERIALIZABLE(å¯ä¸²è¡å)** é离级å«ã ð æå±ä¸ä¸(以ä¸å 容æèªãMySQL ææ¯å å¹ï¼InnoDB åå¨å¼æ(第 2 ç)ã7.7 ç« )ï¼ > InnoDB åå¨å¼ææä¾äºå¯¹ XA äºå¡çæ¯æï¼å¹¶éè¿ XA äºå¡æ¥æ¯æåå¸å¼äºå¡çå®ç°ãåå¸å¼äºå¡æçæ¯å 许å¤ä¸ªç¬ç«çäºå¡èµæºï¼transactional resourcesï¼åä¸å°ä¸ä¸ªå ¨å±çäºå¡ä¸ãäºå¡èµæºé常æ¯å ³ç³»åæ°æ®åºç³»ç»ï¼ä½ä¹å¯ä»¥æ¯å ¶ä»ç±»åçèµæºãå ¨å±äºå¡è¦æ±å¨å ¶ä¸çææåä¸çäºå¡è¦ä¹é½æäº¤ï¼è¦ä¹é½åæ»ï¼è¿å¯¹äºäºå¡åæç ACID è¦æ±åæäºæé«ãå¦å¤ï¼å¨ä½¿ç¨åå¸å¼äºå¡æ¶ï¼InnoDB åå¨å¼æçäºå¡é离级å«å¿ 须设置为 SERIALIZABLEã ## åè - ã髿§è½ MySQLã - https://www.omnisci.com/technical-glossary/relational-database