# 第ä¸ç« ï¼äºå¡  > ä¸äºä½è å£°ç§°ï¼æ¯æéç¨ç䏤鶿®µæäº¤ä»£ä»·å¤ªå¤§ï¼ä¼å¸¦æ¥æ§è½ä¸å¯ç¨æ§çé®é¢ã让ç¨åºåæ¥å¤çè¿åº¦ä½¿ç¨äºå¡å¯¼è´çæ§è½é®é¢ï¼æ»æ¯ç¼ºå°äºå¡ç¼ç¨å¥½å¾å¤ã > > ââ James Corbett ç人ï¼Spannerï¼Google çå ¨çåå¸å¼æ°æ®åºï¼2012ï¼ ------ [TOC] 卿°æ®ç³»ç»çæ®é ·ç°å®ä¸ï¼å¾å¤äºæ é½å¯è½åºéï¼ - æ°æ®åºè½¯ä»¶ã硬件å¯è½å¨ä»»ææ¶å»åçæ éï¼å æ¬åæä½è¿è¡å°ä¸åæ¶ï¼ã - åºç¨ç¨åºå¯è½å¨ä»»ææ¶å»å´©æºï¼å æ¬ä¸ç³»åæä½çä¸é´ï¼ã - ç½ç»ä¸æå¯è½ä¼æå¤åææ°æ®åºä¸åºç¨çè¿æ¥ï¼ææ°æ®åºä¹é´çè¿æ¥ã - å¤ä¸ªå®¢æ·ç«¯å¯è½ä¼åæ¶åå ¥æ°æ®åºï¼è¦çå½¼æ¤çæ´æ¹ã - 客æ·ç«¯å¯è½è¯»åå°æ æä¹çæ°æ®ï¼å ä¸ºæ°æ®åªæ´æ°äºä¸é¨åã - 客æ·ä¹é´çç«äºæ¡ä»¶å¯è½å¯¼è´ä»¤äººæè®¶çé误ã 为äºå®ç°å¯é æ§ï¼ç³»ç»å¿ é¡»å¤çè¿äºæ éï¼ç¡®ä¿å®ä»¬ä¸ä¼å¯¼è´æ´ä¸ªç³»ç»çç¾é¾æ§æ éã使¯å®ç°å®¹éæºå¶å·¥ä½é巨大ãéè¦ä»ç»èèææå¯è½åºéçäºæ ï¼å¹¶è¿è¡å¤§éçæµè¯ï¼ä»¥ç¡®ä¿è§£å³æ¹æ¡çæ£ç®¡ç¨ã æ°åå¹´æ¥ï¼**äºå¡ï¼transactionï¼** ä¸ç´æ¯ç®åè¿äºé®é¢çé¦éæºå¶ãäºå¡æ¯åºç¨ç¨åºå°å¤ä¸ªè¯»åæä½ç»åæä¸ä¸ªé»è¾åå çä¸ç§æ¹å¼ã仿¦å¿µä¸è®²ï¼äºå¡ä¸çææè¯»åæä½è¢«è§ä½å个æä½æ¥æ§è¡ï¼æ´ä¸ªäºå¡è¦ä¹æå **æäº¤**ï¼commitï¼ï¼è¦ä¹å¤±è´¥ **䏿¢**ï¼abortï¼æ **åæ»**ï¼rollbackï¼ãå¦æå¤±è´¥ï¼åºç¨ç¨åºå¯ä»¥å®å ¨å°éè¯ã对äºäºå¡æ¥è¯´ï¼åºç¨ç¨åºçé误å¤çåå¾ç®åå¤äºï¼å 为å®ä¸ç¨åæ å¿é¨åå¤±è´¥çæ åµäºï¼å³æäºæä½æåï¼æäºå¤±è´¥ï¼æ 论åºäºä½ç§åå ï¼ã åäºå¡æäº¤éæ¶é´é¿äºï¼ä½ å¯è½ä¼è§å¾å®æ¾èæè§ã使们ä¸åºå°å ¶è§ä¸ºçæå½ç¶ãäºå¡ä¸æ¯å¤©ç¶åå¨çï¼å®ä»¬æ¯ä¸ºäº **ç®ååºç¨ç¼ç¨æ¨¡å** èå建çãéè¿ä½¿ç¨äºå¡ï¼åºç¨ç¨åºå¯ä»¥èªç±å°å¿½ç¥æäºæ½å¨çé误æ åµåå¹¶åé®é¢ï¼å ä¸ºæ°æ®åºä¼æ¿åºç¨å¤ç好è¿äºãï¼æä»¬ç§°ä¹ä¸º **å®å ¨ä¿è¯**ï¼å³ safety guaranteesï¼ã 并䏿¯ææçåºç¨é½éè¦äºå¡ï¼ææ¶åå¼±åäºå¡ä¿è¯ãæå®å ¨æ¾å¼äºå¡ä¹æ¯æå¥½å¤çï¼ä¾å¦ï¼ä¸ºäºè·å¾æ´é«æ§è½ææ´é«å¯ç¨æ§ï¼ãä¸äºå®å ¨å±æ§ä¹å¯ä»¥å¨æ²¡æäºå¡çæ åµä¸å®ç°ã ææ ·ç¥éä½ æ¯å¦éè¦äºå¡ï¼ä¸ºäºåçè¿ä¸ªé®é¢ï¼é¦å éè¦ç¡®åçè§£äºå¡å¯ä»¥æä¾çå®å ¨ä¿éï¼ä»¥åå®ä»¬ç代价ã尽管ä¹çäºå¡ä¼¼ä¹å¾ç®åï¼ä½å®é ä¸æè®¸å¤å¾®å¦ä½éè¦çç»èå¨èµ·ä½ç¨ã æ¬ç« å°ç 究许å¤åºéæ¡ä¾ï¼å¹¶æ¢ç´¢æ°æ®åºç¨äºé²èè¿äºé®é¢çç®æ³ãå°¤å ¶ä¼æ·±å ¥ **å¹¶åæ§å¶** çé¢åï¼è®¨è®ºåç§å¯è½åççç«äºæ¡ä»¶ï¼ä»¥åæ°æ®åºå¦ä½å®ç° **读已æäº¤ï¼read committedï¼**ï¼**å¿«ç §é离ï¼snapshot isolationï¼** å **å¯ä¸²è¡åï¼serializabilityï¼** çé离级å«ã æ¬ç« åæ¶éç¨äºåæºæ°æ®åºä¸åå¸å¼æ°æ®åºï¼å¨ [ç¬¬å «ç« ](ch8.md) ä¸å°éç¹è®¨è®ºä» åºç°å¨åå¸å¼ç³»ç»ä¸çç¹æ®ææã ## äºå¡çæ£ææ¦å¿µ ç°ä»ï¼å 乿æçå ³ç³»åæ°æ®åºåä¸äºéå ³ç³»æ°æ®åºé½æ¯æ **äºå¡**ãå ¶ä¸å¤§å¤æ°éµå¾ª IBM System Rï¼ç¬¬ä¸ä¸ª SQL æ°æ®åºï¼å¨ 1975 å¹´å¼å ¥ç飿 ¼ã1,2,3ãã40 å¹´éï¼å°½ç®¡ä¸äºå®ç°ç»èåçäºååï¼ä½æ»ä½æè·¯å¤§åå°å¼ï¼MySQLãPostgreSQLãOracle å SQL Server çæ°æ®åºä¸çäºå¡æ¯æä¸ System R å¼ä¹å¯»å¸¸å°ç¸ä¼¼ã 2000 年以åï¼éå ³ç³»ï¼NoSQLï¼æ°æ®åºå¼å§æ®åãå®ä»¬çç®æ æ¯å¨å ³ç³»æ°æ®åºçç°ç¶åºç¡ä¸ï¼éè¿æä¾æ°çæ°æ®æ¨¡åéæ©ï¼è¯·åé [第äºç« ](ch2.md)ï¼å¹¶é»è®¤å å«å¤å¶ï¼ç¬¬äºç« ï¼åååºï¼ç¬¬å ç« ï¼æ¥è¿ä¸æ¥æåãäºå¡æ¯è¿æ¬¡è¿å¨ç主è¦çºç²åï¼è¿äºæ°ä¸ä»£æ°æ®åºä¸çè®¸å¤æ°æ®åºå®å ¨æ¾å¼äºäºå¡ï¼æè éæ°å®ä¹äºè¿ä¸ªè¯ï¼æè¿°æ¯ä»¥åæçè§£çæ´å¼±å¾å¤çä¸å¥ä¿è¯ã4ãã éçè¿ç§æ°ååå¸å¼æ°æ®åºççä½ï¼äººä»¬æ®é认为äºå¡æ¯å¯ä¼¸ç¼©æ§ç对ç«é¢ï¼ä»»ä½å¤§åç³»ç»é½å¿ é¡»æ¾å¼äºå¡ä»¥ä¿æè¯å¥½çæ§è½åé«å¯ç¨æ§ã5,6ããå¦ä¸æ¹é¢ï¼æ°æ®åºååææ¶å°äºå¡ä¿è¯ä½ä¸º âéè¦åºç¨â å âæä»·å¼æ°æ®â çåºæ¬è¦æ±ãè¿ä¸¤ç§è§ç¹é½æ¯ **纯粹çå¤¸å¼ **ã äºå®å¹¶é妿¤ç®åï¼ä¸å ¶ä»ææ¯è®¾è®¡éæ©ä¸æ ·ï¼äºå¡æå ¶ä¼å¿åå±éæ§ã为äºçè§£è¿äºæè¡¡ï¼è®©æä»¬äºè§£äºå¡ææä¾ä¿è¯çç»è ââ æ 论æ¯å¨æ£å¸¸è¿è¡ä¸è¿æ¯å¨åç§æç«¯ï¼ä½æ¯ç°å®åå¨ï¼çæ åµä¸ã ### ACIDçå«ä¹ äºå¡ææä¾çå®å ¨ä¿è¯ï¼é常ç±ä¼æå¨ç¥çé¦åæ¯ç¼©ç¥è¯ ACID æ¥æè¿°ï¼ACID 代表 **ååæ§ï¼Atomicityï¼**ï¼**ä¸è´æ§ï¼Consistencyï¼**ï¼**é离æ§ï¼Isolationï¼** å **æä¹ æ§ï¼Durabilityï¼**ãå®ç± Theo Härder å Andreas Reuter äº 1983 å¹´æåºï¼æ¨å¨ä¸ºæ°æ®åºä¸çå®¹éæºå¶å»ºç«ç²¾ç¡®çæ¯è¯ã ä½å®é ä¸ï¼ä¸åæ°æ®åºç ACID å®ç°å¹¶ä¸ç¸åãä¾å¦ï¼æä»¬å°ä¼çå°ï¼å ³äº **é离æ§** çå«ä¹å°±æè®¸å¤å«ç³ä¸æ¸ ã8ããé«å±æ¬¡ä¸çæ³æ³å¾ç¾å¥½ï¼ä½é鬼éèå¨ç»èéãä»å¤©ï¼å½ä¸ä¸ªç³»ç»å£°ç§°èªå·± â符å ACIDâ æ¶ï¼å®é ä¸è½æå¾ çæ¯ä»ä¹ä¿è¯å¹¶ä¸æ¸ æ¥ãä¸å¹¸çæ¯ï¼ACID ç°å¨å ä¹å·²ç»åæäºä¸ä¸ªè¥éæ¯è¯ã ï¼ä¸ç¬¦å ACID æ åçç³»ç»ææ¶è¢«ç§°ä¸º BASEï¼å®ä»£è¡¨ **åºæ¬å¯ç¨æ§ï¼Basically Availableï¼**ï¼**è½¯ç¶æï¼Soft Stateï¼** å **æç»ä¸è´æ§ï¼Eventual consistencyï¼**ã9ãï¼è¿æ¯ ACID çå®ä¹æ´å 模ç³ï¼ä¼¼ä¹ BASE çå¯ä¸åççå®ä¹æ¯ â䏿¯ ACIDâï¼å³å®å ä¹å¯ä»¥ä»£è¡¨ä»»ä½ä½ æ³è¦çä¸è¥¿ãï¼ è®©æä»¬æ·±å ¥äºè§£ååæ§ï¼ä¸è´æ§ï¼é离æ§åæä¹ æ§çå®ä¹ï¼è¿å¯ä»¥è®©æä»¬æç¼åºäºå¡çææ³ã #### ååæ§ ä¸è¬æ¥è¯´ï¼å忝æä¸è½åè§£æå°é¨åçä¸è¥¿ãè¿ä¸ªè¯å¨è®¡ç®æºçä¸åé¢å䏿å³çç¸ä¼¼ä½åå¾®å¦ä¸åçä¸è¥¿ãä¾å¦ï¼å¨å¤çº¿ç¨ç¼ç¨ä¸ï¼å¦æä¸ä¸ªçº¿ç¨æ§è¡ä¸ä¸ªååæä½ï¼è¿æå³çå¦ä¸ä¸ªçº¿ç¨æ æ³çå°è¯¥æä½çä¸åç»æãç³»ç»åªè½å¤äºæä½ä¹åææä½ä¹åçç¶æï¼è䏿¯ä»äºä¸¤è ä¹é´çç¶æã ç¸æ¯ä¹ä¸ï¼ACID çååæ§å¹¶ **ä¸** æ¯å ³äº **å¹¶åï¼concurrentï¼** çãå®å¹¶ä¸æ¯å¨æè¿°å¦æå 个è¿ç¨è¯å¾åæ¶è®¿é®ç¸åçæ°æ®ä¼åçä»ä¹æ åµï¼è¿ç§æ åµå å«å¨ç¼©å ***I*** ä¸ï¼å³ [**é离æ§**](#é离æ§)ã ACID çååæ§æè¿°äºå½å®¢æ·æ³è¿è¡å¤æ¬¡åå ¥ï¼ä½å¨ä¸äºåæä½å¤çå®ä¹ååºç°æ éçæ åµãä¾å¦è¿ç¨å´©æºï¼ç½ç»è¿æ¥ä¸æï¼ç£çåæ»¡æè æç§å®æ´æ§çº¦æè¢«è¿åã妿è¿äºåæä½è¢«åç»å°ä¸ä¸ªååäºå¡ä¸ï¼å¹¶ä¸è¯¥äºå¡ç±äºé误èä¸è½å®æï¼æäº¤ï¼ï¼å该äºå¡å°è¢«ä¸æ¢ï¼å¹¶ä¸æ°æ®åºå¿ é¡»ä¸¢å¼ææ¤æ¶è¯¥äºå¡ä¸è¿ä»ä¸ºæ¢æåçä»»ä½åå ¥ã å¦ææ²¡æååæ§ï¼å¨å¤å¤æ´æ¹è¿è¡å°ä¸åæ¶åçé误ï¼å¾é¾ç¥éåªäºæ´æ¹å·²ç»çæï¼åªäºæ²¡æçæã该åºç¨ç¨åºå¯ä»¥åè¯ä¸æ¬¡ï¼ä½åçè¿è¡ä¸¤æ¬¡ç¸ååæ´çé£é©ï¼å¯è½ä¼å¯¼è´æ°æ®é夿éè¯¯çæ°æ®ãååæ§ç®åäºè¿ä¸ªé®é¢ï¼å¦æäºå¡è¢« **䏿¢ï¼abortï¼**ï¼åºç¨ç¨åºå¯ä»¥ç¡®å®å®æ²¡ææ¹åä»»ä½ä¸è¥¿ï¼æä»¥å¯ä»¥å®å ¨å°éè¯ã ACID ååæ§çå®ä¹ç¹å¾æ¯ï¼**è½å¤å¨é误æ¶ä¸æ¢äºå¡ï¼ä¸¢å¼è¯¥äºå¡è¿è¡çææåå ¥åæ´çè½åã** æè®¸ **å¯ä¸æ¢æ§ï¼abortabilityï¼** æ¯æ´å¥½çæ¯è¯ï¼ä½æ¬ä¹¦å°ç»§ç»ä½¿ç¨ååæ§ï¼å ä¸ºè¿æ¯æ¯ç¨è¯ã #### ä¸è´æ§ ä¸è´æ§è¿ä¸ªè¯è¢«èµäºå¤ªå¤å«ä¹ï¼ * å¨ [第äºç« ](ch5.md) ä¸ï¼æä»¬è®¨è®ºäºå¯æ¬ä¸è´æ§ï¼ä»¥å弿¥å¤å¶ç³»ç»ä¸çæç»ä¸è´æ§é®é¢ï¼è¯·åé â[å¤å¶å»¶è¿é®é¢](ch5.md#å¤å¶å»¶è¿é®é¢)âï¼ã * [ä¸è´æ§åå¸](ch6.md#ä¸è´æ§åå¸) æ¯æäºç³»ç»ç¨äºéæ°ååºçä¸ç§ååºæ¹æ³ã * å¨ [CAP å®ç](ch9.md#CAPå®ç) ä¸ï¼ä¸è´æ§ä¸è¯ç¨äºè¡¨ç¤º [线æ§ä¸è´æ§](ch9.md#线æ§ä¸è´æ§)ã * å¨ ACID çä¸ä¸æä¸ï¼**ä¸è´æ§** æ¯ææ°æ®åºå¨åºç¨ç¨åºçç¹å®æ¦å¿µä¸å¤äº âè¯å¥½ç¶æâã å¾ä¸å¹¸ï¼è¿ä¸ä¸ªè¯å°±è³å°æåç§ä¸åçå«ä¹ã ACID ä¸è´æ§çæ¦å¿µæ¯ï¼**å¯¹æ°æ®çä¸ç»ç¹å®çº¦æå¿ é¡»å§ç»æç«**ãå³ **ä¸åå¼ï¼invariantsï¼**ãä¾å¦ï¼å¨ä¼è®¡ç³»ç»ä¸ï¼ææè´¦æ·æ´ä½ä¸å¿ é¡»åè´·ç¸æµã妿ä¸ä¸ªäºå¡å¼å§äºä¸ä¸ªæ»¡è¶³è¿äºä¸åå¼çæææ°æ®åºï¼ä¸å¨äºå¡å¤çæé´çä»»ä½åå ¥æä½é½ä¿æè¿ç§æææ§ï¼é£ä¹å¯ä»¥ç¡®å®ï¼ä¸å弿»æ¯æ»¡è¶³çã 使¯ï¼ä¸è´æ§çè¿ç§æ¦å¿µåå³äºåºç¨ç¨åºå¯¹ä¸åå¼ççè§£ï¼åºç¨ç¨åºè´è´£æ£ç¡®å®ä¹å®çäºå¡ï¼å¹¶ä¿æä¸è´æ§ãè¿å¹¶ä¸æ¯æ°æ®åºå¯ä»¥ä¿è¯çäºæ ï¼å¦æä½ åå ¥è¿åä¸åå¼çèæ°æ®ï¼æ°æ®åºä¹æ æ³é»æ¢ä½ ï¼ä¸äºç¹å®ç±»åçä¸åå¼å¯ä»¥ç±æ°æ®åºæ£æ¥ï¼ä¾å¦å¤é®çº¦ææå¯ä¸çº¦æï¼ä½æ¯ä¸è¬æ¥è¯´ï¼æ¯åºç¨ç¨åºæ¥å®ä¹ä»ä¹æ ·çæ°æ®æ¯ææçï¼ä»ä¹æ ·æ¯æ æçãââ æ°æ®åºåªç®¡åå¨ï¼ã ååæ§ï¼é离æ§åæä¹ æ§æ¯æ°æ®åºç屿§ï¼èä¸è´æ§ï¼å¨ ACID æä¹ä¸ï¼æ¯åºç¨ç¨åºç屿§ãåºç¨å¯è½ä¾èµæ°æ®åºçååæ§åéç¦»å±æ§æ¥å®ç°ä¸è´æ§ï¼ä½è¿å¹¶ä¸ä» åå³äºæ°æ®åºãå æ¤ï¼åæ¯ C ä¸å±äº ACID [^i]ã [^i]: ä¹ã»æµ·åæ¯å¦ï¼Joe Hellersteinï¼æåºï¼å¨ Härder ä¸ Reuter ç论æä¸ï¼âACID ä¸ç Câ æ¯è¢« âæè¿å»å缩ååè¯çâã7ãï¼èä¸é£æ¶å大家é½ä¸æä¹å¨ä¹ä¸è´æ§ã #### éç¦»æ§ å¤§å¤æ°æ°æ®åºé½ä¼åæ¶è¢«å¤ä¸ªå®¢æ·ç«¯è®¿é®ã妿å®ä»¬åèªè¯»åæ°æ®åºçä¸åé¨åï¼è¿æ¯æ²¡æé®é¢çï¼ä½æ¯å¦æå®ä»¬è®¿é®ç¸åçæ°æ®åºè®°å½ï¼åå¯è½ä¼éå° **å¹¶å** é®é¢ï¼**ç«äºæ¡ä»¶**ï¼å³ race conditionsï¼ã [å¾ 7-1](img/fig7-1.png) æ¯è¿ç±»é®é¢çä¸ä¸ªç®åä¾åãåè®¾ä½ æä¸¤ä¸ªå®¢æ·ç«¯åæ¶å¨æ°æ®åºä¸å¢é¿ä¸ä¸ªè®¡æ°å¨ãï¼åè®¾æ°æ®åºæ²¡æå 建çèªå¢æä½ï¼æ¯ä¸ªå®¢æ·ç«¯éè¦è¯»å计æ°å¨çå½åå¼ï¼å 1 ï¼åååæ°å¼ã[å¾ 7-1](img/fig7-1.png) ä¸ï¼å 为åçäºä¸¤æ¬¡å¢é¿ï¼è®¡æ°å¨åºè¯¥ä» 42 å¢è³ 44ï¼ä½ç±äºç«ææ¡ä»¶ï¼å®é ä¸åªå¢è³ 43 ã ACID æä¹ä¸çéç¦»æ§æå³çï¼**åæ¶æ§è¡çäºå¡æ¯ç¸äºé离ç**ï¼å®ä»¬ä¸è½ç¸äºåç¯ãä¼ ç»çæ°æ®åºæç§ä¹¦å°é离æ§å½¢å¼å为 **å¯ä¸²è¡åï¼Serializabilityï¼**ï¼è¿æå³çæ¯ä¸ªäºå¡å¯ä»¥åè£ å®æ¯å¯ä¸å¨æ´ä¸ªæ°æ®åºä¸è¿è¡çäºå¡ãæ°æ®åºç¡®ä¿å½å¤ä¸ªäºå¡è¢«æäº¤æ¶ï¼ç»æä¸å®ä»¬ä¸²è¡è¿è¡ï¼ä¸ä¸ªæ¥ä¸ä¸ªï¼æ¯ä¸æ ·çï¼å°½ç®¡å®é ä¸å®ä»¬å¯è½æ¯å¹¶åè¿è¡çã10ãã  **å¾ 7-1 两个客æ·ä¹é´çç«äºç¶æåæ¶éå¢è®¡æ°å¨** ç¶èå®è·µä¸å¾å°ä¼ä½¿ç¨å¯ä¸²è¡çé离ï¼å ä¸ºå®ææ§è½æå¤±ãä¸äºæµè¡çæ°æ®åºå¦ Oracle 11gï¼çè³æ²¡æå®ç°å®ãå¨ Oracle 䏿ä¸ä¸ªå为 âå¯ä¸²è¡çâ é离级å«ï¼ä½å®é ä¸å®å®ç°äºä¸ç§å«å **å¿«ç §é离ï¼snapshot isolationï¼** çåè½ï¼**è¿æ¯ä¸ç§æ¯å¯ä¸²è¡åæ´å¼±çä¿è¯**ã8,11ããæä»¬å°å¨ â[å¼±é离级å«](#å¼±é离级å«)â ä¸ç ç©¶å¿«ç §é离åå ¶ä»å½¢å¼çé离ã #### æä¹ æ§ æ°æ®åºç³»ç»çç®çæ¯ï¼æä¾ä¸ä¸ªå®å ¨çå°æ¹å卿°æ®ï¼èä¸ç¨æ å¿ä¸¢å¤±ã**æä¹ æ§** æ¯ä¸ä¸ªæ¿è¯ºï¼å³ä¸æ¦äºå¡æå宿ï¼å³ä½¿åç硬件æ éææ°æ®åºå´©æºï¼åå ¥ç任使°æ®ä¹ä¸ä¼ä¸¢å¤±ã å¨åèç¹æ°æ®åºä¸ï¼æä¹ æ§é常æå³çæ°æ®å·²è¢«åå ¥éæå¤±æ§åå¨è®¾å¤ï¼å¦ç¡¬çæ SSDãå®é常è¿å æ¬é¢åæ¥å¿æç±»ä¼¼çæä»¶ï¼è¯·åé â[让 B æ æ´å¯é ](ch3.md#让Bæ æ´å¯é )âï¼ï¼ä»¥ä¾¿å¨ç£çä¸çæ°æ®ç»ææåæ¶è¿è¡æ¢å¤ãå¨å¸¦å¤å¶çæ°æ®åºä¸ï¼æä¹ æ§å¯è½æå³çæ°æ®å·²æåå¤å¶å°ä¸äºèç¹ãä¸ºäºæä¾æä¹ æ§ä¿è¯ï¼æ°æ®åºå¿ é¡»çå°è¿äºåå ¥æå¤å¶å®æåï¼æè½æ¥åäºå¡æåæäº¤ã å¦ â[å¯é æ§](ch1.md#å¯é æ§)â ä¸èæè¿°ï¼**å®ç¾çæä¹ æ§æ¯ä¸åå¨ç** ï¼å¦æææç¡¬çåææå¤ä»½åæ¶è¢«éæ¯ï¼é£æ¾ç¶æ²¡æä»»ä½æ°æ®åºè½æå¾äºä½ ã > #### å¤å¶ä¸æä¹ æ§ > > å¨åå²ä¸ï¼æä¹ æ§æå³çåå ¥å½æ¡£ç£å¸¦ã忥å®è¢«ç解为åå ¥ç£çæ SSDãå忥å®åæäºæ°çå æ¶µå³ âå¤å¶ï¼replicationï¼âãåªç§å®ç°æ´å¥½ä¸äºï¼ > > çç¸æ¯ï¼æ²¡æä»ä¹æ¯å®ç¾çï¼ > > * å¦æä½ åå ¥ç£çç¶åæºå¨å®æºï¼å³ä½¿æ°æ®æ²¡æä¸¢å¤±ï¼å¨ä¿®å¤æºå¨æå°ç£ç转移å°å ¶ä»æºå¨ä¹åï¼ä¹æ¯æ æ³è®¿é®çãè¿ç§æ åµä¸ï¼å¤å¶ç³»ç»å¯ä»¥ä¿æå¯ç¨æ§ã > * ä¸ä¸ªç¸å ³æ§æ éï¼åçµï¼æä¸ä¸ªç¹å®è¾å ¥å¯¼è´ææèç¹å´©æºç Bugï¼å¯è½ä¼ä¸æ¬¡æ§æ§æ¯ææå¯æ¬ï¼è¯·åé ã[å¯é æ§](ch1.md#å¯é æ§)ãï¼ï¼ä»»ä½ä» åå¨å¨å åä¸çæ°æ®é½ä¼ä¸¢å¤±ï¼æ å åæ°æ®åºä»ç¶è¦åç£çåå ¥æäº¤éã > * å¨å¼æ¥å¤å¶ç³»ç»ä¸ï¼å½ä¸»åºä¸å¯ç¨æ¶ï¼æè¿çåå ¥æä½å¯è½ä¼ä¸¢å¤±ï¼è¯·åé ã[å¤çèç¹å®æº](ch5.md#å¤çèç¹å®æº)ãï¼ã > * å½çµæºçªç¶æçµæ¶ï¼ç¹å«æ¯åºæç¡¬çï¼æè¯æ®æ¾ç¤ºææ¶ä¼è¿ååºæçä¿è¯ï¼çè³ fsync ä¹ä¸è½ä¿è¯æ£å¸¸å·¥ä½ã12ãã硬çåºä»¶å¯è½æé误ï¼å°±åä»»ä½å ¶ä»ç±»åçè½¯ä»¶ä¸æ ·ã13,14ãã > * åå¨å¼æåæä»¶ç³»ç»ä¹é´çå¾®å¦äº¤äºå¯è½ä¼å¯¼è´é¾ä»¥è¿½è¸ªçé误ï¼å¹¶å¯è½å¯¼è´ç£çä¸çæä»¶å¨å´©æºå被æåã15,16ãã > * ç£çä¸çæ°æ®å¯è½ä¼å¨æ²¡ææ£æµå°çæ åµä¸éæ¸æåã17ããå¦ææ°æ®å·²æå䏿®µæ¶é´ï¼å¯æ¬åæè¿çå¤ä»½ä¹å¯è½æåãè¿ç§æ åµä¸ï¼éè¦å°è¯ä»åå²å¤ä»½ä¸æ¢å¤æ°æ®ã > * ä¸é¡¹å ³äºåºæç¡¬ççç ç©¶åç°ï¼å¨è¿è¡çååå¹´ä¸ï¼30% å° 80% ç硬çä¼äº§çè³å°ä¸ä¸ªååã18ããç¸æ¯åºæç¡¬çï¼ç£ççåéçè¾ä½ï¼ä½å®å ¨å¤±æçæ¦çæ´é«ã > * 妿 SSD æçµï¼å¯è½ä¼å¨å å¨å å¼å§ä¸¢å¤±æ°æ®ï¼å ·ä½åå³äºæ¸©åº¦ã19ãã > > å¨å®è·µä¸ï¼æ²¡æä¸ç§ææ¯å¯ä»¥æä¾ç»å¯¹ä¿è¯ãåªæåç§éä½é£é©çææ¯ï¼å æ¬åå ¥ç£çï¼å¤å¶å°è¿ç¨æºå¨åå¤ä»½ ââ å®ä»¬å¯ä»¥ä¸åºè¯¥ä¸èµ·ä½¿ç¨ãä¸å¾å¸¸ä¸æ ·ï¼æå¥½æ±çæççæåº¦æ¥åä»»ä½ç论ä¸ç âä¿è¯âã ### å对象åå¤å¯¹è±¡æä½ å顾ä¸ä¸ï¼å¨ ACID ä¸ï¼ååæ§åéç¦»æ§æè¿°äºå®¢æ·ç«¯å¨åä¸äºå¡ä¸æ§è¡å¤æ¬¡åå ¥æ¶ï¼æ°æ®åºåºè¯¥åçäºæ ï¼ * ååæ§ 妿å¨ä¸ç³»ååæä½çä¸éåçé误ï¼ååºä¸æ¢äºå¡å¤çï¼å¹¶ä¸¢å¼å½åäºå¡çææåå ¥ãæ¢å¥è¯è¯´ï¼æ°æ®åºå å»äºç¨æ·å¯¹é¨åå¤±è´¥çæ å¿§ ââ éè¿æä¾ â**å®ä¸ºçç¢ï¼ä¸ä¸ºç¦å ¨ï¼all-or-nothingï¼**â çä¿è¯ã * éç¦»æ§ åæ¶è¿è¡çäºå¡ä¸åºè¯¥äºç¸å¹²æ°ãä¾å¦ï¼å¦æä¸ä¸ªäºå¡è¿è¡å¤æ¬¡åå ¥ï¼åå¦ä¸ä¸ªäºå¡è¦ä¹çå°å ¨é¨åå ¥ç»æï¼è¦ä¹ä»ä¹é½çä¸å°ï¼ä½ä¸åºè¯¥æ¯ä¸äºåéã è¿äºå®ä¹åè®¾ä½ æ³åæ¶ä¿®æ¹å¤ä¸ªå¯¹è±¡ï¼è¡ï¼ææ¡£ï¼è®°å½ï¼ãé常éè¦ **å¤å¯¹è±¡äºå¡ï¼multi-object transactionï¼** æ¥ä¿æå¤åæ°æ®åæ¥ã[å¾ 7-2](img/fig7-2.png) å±ç¤ºäºä¸ä¸ªæ¥èªçµé®åºç¨çä¾åãæ§è¡ä»¥ä¸æ¥è¯¢æ¥æ¾ç¤ºç¨æ·æªè¯»é®ä»¶æ°éï¼ ```sql SELECT COUNTï¼*ï¼FROM emails WHERE recipient_id = 2 AND unread_flag = true ``` ä½å¦æé®ä»¶å¤ªå¤ï¼ä½ å¯è½ä¼è§å¾è¿ä¸ªæ¥è¯¢å¤ªæ ¢ï¼å¹¶å³å®ç¨åç¬çåæ®µå卿ªè¯»é®ä»¶çæ°éï¼ä¸ç§åè§èåï¼ãç°å¨æ¯å½ä¸ä¸ªæ°æ¶æ¯åå ¥æ¶ï¼å¿ é¡»ä¹å¢é¿æªè¯»è®¡æ°å¨ï¼æ¯å½ä¸ä¸ªæ¶æ¯è¢«æ 记为已读æ¶ï¼ä¹å¿ é¡»åå°æªè¯»è®¡æ°å¨ã å¨ [å¾ 7-2](img/fig7-2.png) ä¸ï¼ç¨æ· 2 éå°å¼å¸¸æ åµï¼é®ä»¶åè¡¨éæ¾ç¤ºææªè¯»æ¶æ¯ï¼ä½è®¡æ°å¨æ¾ç¤ºä¸ºé¶æªè¯»æ¶æ¯ï¼å 为计æ°å¨å¢é¿è¿æ²¡æåç [^ii]ãé离æ§å¯ä»¥é¿å è¿ä¸ªé®é¢ï¼éè¿ç¡®ä¿ç¨æ· 2 è¦ä¹åæ¶çå°æ°é®ä»¶åå¢é¿åç计æ°å¨ï¼è¦ä¹é½çä¸å°ï¼è䏿¯ä¸ä¸ªååçç¾çä¸é´ç»æã [^ii]: å¯ä»¥è¯´é®ä»¶åºç¨ä¸çé误计æ°å¨å¹¶ä¸æ¯ä»ä¹ç¹å«éè¦çé®é¢ã使¢ç§æ¹å¼æ¥çï¼ä½ å¯ä»¥ææªè¯»è®¡æ°å¨æ¢æå®¢æ·è´¦æ·ä½é¢ï¼æé®ä»¶æ¶åçææ¯ä»äº¤æã  **å¾ 7-2 è¿åé离æ§ï¼ä¸ä¸ªäºå¡è¯»åå¦ä¸ä¸ªäºå¡çæªè¢«æ§è¡çåå ¥ï¼âè读âï¼ã** [å¾ 7-3](img/fig7-3.png) 说æäºå¯¹ååæ§çéæ±ï¼å¦æå¨äºå¡è¿ç¨ä¸åçé误ï¼é®ç®±åæªè¯»è®¡æ°å¨çå 容å¯è½ä¼å¤±å»åæ¥ãå¨ååäºå¡ä¸ï¼å¦æå¯¹è®¡æ°å¨çæ´æ°å¤±è´¥ï¼äºå¡å°è¢«ä¸æ¢ï¼å¹¶ä¸æå ¥ççµåé®ä»¶å°è¢«åæ»ã  **å¾ 7-3 ååæ§ç¡®ä¿åçé误æ¶ï¼äºå¡å åçä»»ä½åå ¥é½ä¼è¢«æ¤æ¶ï¼ä»¥é¿å ç¶æä¸ä¸è´** å¤å¯¹è±¡äºå¡éè¦æç§æ¹å¼æ¥ç¡®å®åªäºè¯»åæä½å±äºåä¸ä¸ªäºå¡ãå¨å ³ç³»åæ°æ®åºä¸ï¼é常åºäºå®¢æ·ç«¯ä¸æ°æ®åºæå¡å¨ç TCP è¿æ¥ï¼å¨ä»»ä½ç¹å®è¿æ¥ä¸ï¼`BEGIN TRANSACTION` å `COMMIT` è¯å¥ä¹é´çææå 容ï¼è¢«è®¤ä¸ºæ¯åä¸äºå¡çä¸é¨å.[^iii] [^iii]: è¿å¹¶ä¸å®ç¾ã妿 TCP è¿æ¥ä¸æï¼åäºå¡å¿ 须䏿¢ã妿䏿åçå¨å®¢æ·ç«¯è¯·æ±æäº¤ä¹åï¼ä½å¨æå¡å¨ç¡®è®¤æäº¤åçä¹åï¼å®¢æ·ç«¯å¹¶ä¸ç¥éäºå¡æ¯å¦å·²æäº¤ã为äºè§£å³è¿ä¸ªé®é¢ï¼äºå¡ç®¡çå¨å¯ä»¥éè¿ä¸ä¸ªå¯ä¸äºå¡æ è¯ç¬¦æ¥å¯¹æä½è¿è¡åç»ï¼è¿ä¸ªæ è¯ç¬¦å¹¶æªç»å®å°ç¹å® TCP è¿æ¥ãåç»å â[æ°æ®åºç端å°ç«¯åå](ch12.md#æ°æ®åºç端å°ç«¯åå)â ä¸èå°åå°è¿ä¸ªä¸»é¢ã å¦ä¸æ¹é¢ï¼è®¸å¤éå ³ç³»æ°æ®åºå¹¶æ²¡æå°è¿äºæä½ç»åå¨ä¸èµ·çæ¹æ³ãå³ä½¿åå¨å¤å¯¹è±¡ APIï¼ä¾å¦ï¼æé®å¼åå¨å¯è½å ·æå¨ä¸ä¸ªæä½ä¸æ´æ°å 个é®ç multi-put æä½ï¼ï¼ä½è¿å¹¶ä¸ä¸å®æå³çå®å ·æäºå¡è¯ä¹ï¼è¯¥å½ä»¤å¯è½å¨ä¸äºé®ä¸æåï¼å¨å ¶ä»çé®ä¸å¤±è´¥ï¼ä½¿æ°æ®åºå¤äºé¨åæ´æ°çç¶æã #### å对象åå ¥ å½å个对象åçæ¹åæ¶ï¼ååæ§åé离æ§ä¹æ¯éç¨çãä¾å¦ï¼åè®¾ä½ æ£å¨åæ°æ®åºåå ¥ä¸ä¸ª 20 KB ç JSON ææ¡£ï¼ - 妿å¨åé第ä¸ä¸ª 10 KB ä¹åç½ç»è¿æ¥ä¸æï¼æ°æ®åºæ¯å¦åå¨äºä¸å¯è§£æç 10KB JSON çæ®µï¼ - 妿卿°æ®åºæ£å¨è¦çç£çä¸çåä¸ä¸ªå¼çè¿ç¨ä¸çµæºåçæ éï¼æ¯å¦æç»å°æ°æ§å¼æ¼æ¥å¨ä¸èµ·ï¼ - 妿å¦ä¸ä¸ªå®¢æ·ç«¯å¨åå ¥è¿ç¨ä¸è¯»åè¯¥ææ¡£ï¼æ¯å¦ä¼çå°é¨åæ´æ°çå¼ï¼ è¿äºé®é¢éå¸¸è®©äººå¤´å¤§ï¼æ åå¨å¼æä¸ä¸ªå 乿®éçç®æ æ¯ï¼å¯¹åèç¹ä¸çå个对象ï¼ä¾å¦é®å¼å¯¹ï¼ä¸æä¾ååæ§åé离æ§ãååæ§å¯ä»¥éè¿ä½¿ç¨æ¥å¿æ¥å®ç°å´©æºæ¢å¤ï¼è¯·åé â[让 B æ æ´å¯é ](ch3.md#让Bæ æ´å¯é )âï¼ï¼å¹¶ä¸å¯ä»¥ä½¿ç¨æ¯ä¸ªå¯¹è±¡ä¸ç鿥å®ç°éç¦»ï¼æ¯æ¬¡åªå 许ä¸ä¸ªçº¿ç¨è®¿é®å¯¹è±¡ï¼ ã ä¸äºæ°æ®åºä¹æä¾æ´å¤æçååæä½ [^iv]ï¼ä¾å¦èªå¢æä½ï¼è¿æ ·å°±ä¸åéè¦å [å¾ 7-1](img/fig7-1.png) 飿 ·ç读å - ä¿®æ¹ - åå ¥åºåäºãåæ ·æµè¡çæ¯ **[æ¯è¾å设置ï¼CAS, compare-and-setï¼](#æ¯è¾å¹¶è®¾ç½®ï¼CASï¼)** æä½ï¼ä» å½å¼æ²¡æè¢«å ¶ä»å¹¶åä¿®æ¹è¿æ¶ï¼æå 许æ§è¡åæä½ã [^iv]: ä¸¥æ ¼å°è¯´ï¼**ååèªå¢ï¼atomic incrementï¼** è¿ä¸ªæ¯è¯å¨å¤çº¿ç¨ç¼ç¨çæä¹ä¸ä½¿ç¨äºååè¿ä¸ªè¯ã å¨ ACID çæ åµä¸ï¼å®å®é ä¸åºè¯¥è¢«ç§°ä¸º **é离çï¼isolatedï¼** çæ **å¯ä¸²è¡çï¼serializableï¼** çå¢éã ä½è¿å°±å¤ªå¹æ¯æ±çµäºã è¿äºå对象æä½å¾æç¨ï¼å 为å®ä»¬å¯ä»¥é²æ¢å¨å¤ä¸ªå®¢æ·ç«¯å°è¯åæ¶åå ¥åä¸ä¸ªå¯¹è±¡æ¶ä¸¢å¤±æ´æ°ï¼è¯·åé â[鲿¢ä¸¢å¤±æ´æ°](#鲿¢ä¸¢å¤±æ´æ°)âï¼ãä½å®ä»¬ä¸æ¯é常æä¹ä¸çäºå¡ãCAS 以åå ¶ä»åä¸å¯¹è±¡æä½è¢«ç§°ä¸º âè½»é级äºå¡âï¼çè³åºäºè¥éç®ç被称为 âACIDâã20,21,22ãï¼ä½æ¯è¿ä¸ªæ¯è¯æ¯è¯¯å¯¼æ§çãäºå¡é常被ç解为ï¼**å°å¤ä¸ªå¯¹è±¡ä¸çå¤ä¸ªæä½å并为ä¸ä¸ªæ§è¡åå çæºå¶**ã #### å¤å¯¹è±¡äºå¡çéæ± 许å¤åå¸å¼æ°æ®åå¨å·²ç»æ¾å¼äºå¤å¯¹è±¡äºå¡ï¼å 为å¤å¯¹è±¡äºå¡å¾é¾è·¨ååºå®ç°ï¼èä¸å¨éè¦é«å¯ç¨æ§æé«æ§è½çæ åµä¸ï¼å®ä»¬å¯è½ä¼ç¢äºãä½è¯´å°åºï¼å¨åå¸å¼æ°æ®åºä¸å®ç°äºå¡ï¼å¹¶æ²¡æä»ä¹æ ¹æ¬æ§çéç¢ã[第ä¹ç« ](ch9.md) å°è®¨è®ºåå¸å¼äºå¡çå®ç°ã 使¯æä»¬æ¯å¦éè¦å¤å¯¹è±¡äºå¡ï¼**æ¯å¦æå¯è½åªç¨é®å¼æ°æ®æ¨¡ååå对象æä½æ¥å®ç°ä»»ä½åºç¨ç¨åºï¼** æä¸äºåºæ¯ä¸ï¼å对象æå ¥ï¼æ´æ°åå 餿¯è¶³å¤çã使¯è®¸å¤å ¶ä»åºæ¯éè¦åè°åå ¥å 个ä¸åçå¯¹è±¡ï¼ * å¨å ³ç³»æ°æ®æ¨¡åä¸ï¼ä¸ä¸ªè¡¨ä¸çè¡éå¸¸å ·æå¯¹å¦ä¸ä¸ªè¡¨ä¸çè¡çå¤é®å¼ç¨ãï¼ç±»ä¼¼çæ¯ï¼å¨ä¸ä¸ªå¾æ°æ®æ¨¡åä¸ï¼ä¸ä¸ªé¡¶ç¹æçå°å ¶ä»é¡¶ç¹çè¾¹ï¼ãå¤å¯¹è±¡äºå¡ä½¿ä½ ç¡®ä¿è¿äºå¼ç¨å§ç»ææï¼å½æå ¥å 个ç¸äºå¼ç¨çè®°å½æ¶ï¼å¤é®å¿ é¡»æ¯æ£ç¡®çåææ°çï¼ä¸ç¶æ°æ®å°±æ²¡ææä¹ã * å¨ææ¡£æ°æ®æ¨¡åä¸ï¼éè¦ä¸èµ·æ´æ°çåæ®µé常å¨åä¸ä¸ªææ¡£ä¸ï¼è¿è¢«è§ä¸ºå个对象 ââ æ´æ°åä¸ªææ¡£æ¶ä¸éè¦å¤å¯¹è±¡äºå¡ã使¯ï¼ç¼ºä¹è¿æ¥åè½çææ¡£æ°æ®åºä¼é¼å±éè§èåï¼è¯·åé â[å ³ç³»åæ°æ®åºä¸ææ¡£æ°æ®åºå¨ä»æ¥ç对æ¯](ch2.md#å ³ç³»åæ°æ®åºä¸ææ¡£æ°æ®åºå¨ä»æ¥ç对æ¯)âï¼ãå½éè¦æ´æ°éè§èåçä¿¡æ¯æ¶ï¼å¦ [å¾ 7-2](img/fig7-2.png) æç¤ºï¼éè¦ä¸æ¬¡æ´æ°å¤ä¸ªææ¡£ãäºå¡å¨è¿ç§æ åµä¸é常æç¨ï¼å¯ä»¥é²æ¢éè§èåçæ°æ®ä¸åæ¥ã * å¨å ·ææ¬¡çº§ç´¢å¼çæ°æ®åºä¸ï¼é¤äºçº¯ç²¹çé®å¼åå¨ä»¥å¤å ä¹é½æï¼ï¼æ¯æ¬¡æ´æ¹å¼æ¶é½éè¦æ´æ°ç´¢å¼ãä»äºå¡è§åº¦æ¥çï¼è¿äºç´¢å¼æ¯ä¸åçæ°æ®åºå¯¹è±¡ï¼ä¾å¦ï¼å¦ææ²¡æäºå¡é离æ§ï¼è®°å½å¯è½åºç°å¨ä¸ä¸ªç´¢å¼ä¸ï¼ä½æ²¡æåºç°å¨å¦ä¸ä¸ªç´¢å¼ä¸ï¼å 为第äºä¸ªç´¢å¼çæ´æ°è¿æ²¡æåçã è¿äºåºç¨ä»ç¶å¯ä»¥å¨æ²¡æäºå¡çæ åµä¸å®ç°ãç¶èï¼**没æååæ§ï¼é误å¤çå°±è¦å¤æå¾å¤ï¼ç¼ºä¹é离æ§ï¼å°±ä¼å¯¼è´å¹¶åé®é¢**ãæä»¬å°å¨ â[å¼±é离级å«](#å¼±é离级å«)â ä¸è®¨è®ºè¿äºé®é¢ï¼å¹¶å¨ [第åäºç« ](ch12.md) 䏿¢è®¨å ¶ä»æ¹æ³ã #### å¤çé误å䏿¢ äºå¡çä¸ä¸ªå ³é®ç¹æ§æ¯ï¼å¦æåçé误ï¼å®å¯ä»¥ä¸æ¢å¹¶å®å ¨å°éè¯ã ACID æ°æ®åºåºäºè¿æ ·çå²å¦ï¼å¦ææ°æ®åºæè¿åå ¶ååæ§ï¼éç¦»æ§ææä¹ æ§çå±é©ï¼å宿¿å®å ¨æ¾å¼äºå¡ï¼è䏿¯çä¸åæåã ç¶è并䏿¯ææçç³»ç»é½éµå¾ªè¿ä¸ªå²å¦ãç¹å«æ¯å ·æ [æ 主å¤å¶](ch5.md#æ 主å¤å¶) çæ°æ®åå¨ï¼ä¸»è¦æ¯å¨ âå°½åè为â çåºç¡ä¸è¿è¡å·¥ä½ãå¯ä»¥æ¦æ¬ä¸º âæ°æ®åºå°åå°½å¯è½å¤çäºï¼è¿è¡éå°é误æ¶ï¼å®ä¸ä¼æ¤æ¶å®å·²ç»å®æçäºæ â ââ æä»¥ï¼ä»éè¯¯ä¸æ¢å¤æ¯åºç¨ç¨åºç责任ã é误åçä¸å¯é¿å ï¼ä½è®¸å¤è½¯ä»¶å¼å人åå¾åäºåªèèä¹è§æ åµï¼è䏿¯é误å¤çç夿æ§ãä¾å¦ï¼å Rails ç ActiveRecord å Django è¿æ ·ç **å¯¹è±¡å ³ç³»æ å°ï¼ORM, object-relation Mappingï¼** æ¡æ¶ä¸ä¼éè¯ä¸æçäºå¡ ââ è¿ä¸ªé误é常ä¼å¯¼è´ä¸ä¸ªä»å æ åä¸ä¼ æçå¼å¸¸ï¼æä»¥ä»»ä½ç¨æ·è¾å ¥é½ä¼è¢«ä¸¢å¼ï¼ç¨æ·æ¿å°ä¸ä¸ªé误信æ¯ãè¿å®å¨æ¯å¤ªè»è¾±äºï¼å ä¸ºä¸æ¢çéç¹å°±æ¯å 许å®å ¨çéè¯ã 尽管éè¯ä¸ä¸ªä¸æ¢çäºå¡æ¯ä¸ä¸ªç®åèææçé误å¤çæºå¶ï¼ä½å®å¹¶ä¸å®ç¾ï¼ - 妿äºå¡å®é 䏿åäºï¼ä½æ¯å¨æå¡å¨è¯å¾å客æ·ç«¯ç¡®è®¤æäº¤æåæ¶ç½ç»åçæ éï¼æä»¥å®¢æ·ç«¯è®¤ä¸ºæäº¤å¤±è´¥äºï¼ï¼é£ä¹éè¯äºå¡ä¼å¯¼è´äºå¡è¢«æ§è¡ä¸¤æ¬¡ ââ é¤éä½ æä¸ä¸ªé¢å¤çåºç¨çº§å»éæºå¶ã - 妿é误æ¯ç±äºè´è½½è¿å¤§é æçï¼åéè¯äºå¡å°ä½¿é®é¢å徿´ç³ï¼è䏿¯æ´å¥½ã为äºé¿å è¿ç§æ£åé¦å¾ªç¯ï¼å¯ä»¥éå¶éè¯æ¬¡æ°ï¼ä½¿ç¨ææ°éé¿ç®æ³ï¼å¹¶åç¬å¤çä¸è¿è½½ç¸å ³çé误ï¼å¦æå 许ï¼ã - ä» å¨ä¸´æ¶æ§é误ï¼ä¾å¦ï¼ç±äºæ»éï¼å¼å¸¸æ åµï¼ä¸´æ¶æ§ç½ç»ä¸æåæ é忢ï¼åæå¼å¾éè¯ãå¨åçæ°¸ä¹ æ§é误ï¼ä¾å¦ï¼è¿å约æï¼ä¹åéè¯æ¯æ¯«æ æä¹çã - 妿äºå¡å¨æ°æ®åºä¹å¤ä¹æå¯ä½ç¨ï¼å³ä½¿äºå¡è¢«ä¸æ¢ï¼ä¹å¯è½åçè¿äºå¯ä½ç¨ãä¾å¦ï¼å¦æä½ æ£å¨åéçµåé®ä»¶ï¼é£ä½ è¯å®ä¸å¸ææ¯æ¬¡éè¯äºå¡æ¶é½éæ°åéçµåé®ä»¶ãå¦æä½ æ³ç¡®ä¿å 个ä¸åçç³»ç»ä¸èµ·æäº¤ææ¾å¼ï¼**䏤鶿®µæäº¤ï¼2PC, two-phase commitï¼** å¯ä»¥æä¾å¸®å©ï¼â[ååæäº¤ä¸ä¸¤é¶æ®µæäº¤](ch9.md#ååæäº¤ä¸ä¸¤é¶æ®µæäº¤)â ä¸å°è®¨è®ºè¿ä¸ªé®é¢ï¼ã - 妿客æ·ç«¯è¿ç¨å¨éè¯ä¸å¤±æï¼ä»»ä½è¯å¾åå ¥æ°æ®åºçæ°æ®é½å°ä¸¢å¤±ã ## å¼±éç¦»çº§å« å¦æä¸¤ä¸ªäºå¡ä¸è§¦åç¸åçæ°æ®ï¼å®ä»¬å¯ä»¥å®å ¨å° **å¹¶è¡ï¼parallelï¼** è¿è¡ï¼å 为两è é½ä¸ä¾èµäºå¦ä¸ä¸ªãå½ä¸ä¸ªäºå¡è¯»åç±å¦ä¸ä¸ªäºå¡åæ¶ä¿®æ¹çæ°æ®æ¶ï¼æè å½ä¸¤ä¸ªäºå¡è¯å¾åæ¶ä¿®æ¹ç¸åçæ°æ®æ¶ï¼å¹¶åé®é¢ï¼ç«äºæ¡ä»¶ï¼æä¼åºç°ã å¹¶å BUG å¾é¾éè¿æµè¯æ¾å°ï¼å ä¸ºè¿æ ·çéè¯¯åªæå¨ç¹æ®æ¶åºä¸æä¼è§¦åãè¿æ ·çæ¶åºé®é¢å¯è½é常å°åçï¼é常å¾é¾éç° [^è¯æ³¨i]ãå¹¶åæ§ä¹å¾é¾æ¨çï¼ç¹å«æ¯å¨å¤§ååºç¨ä¸ï¼ä½ ä¸ä¸å®ç¥éåªäºå ¶ä»ä»£ç æ£å¨è®¿é®æ°æ®åºãå¨ä¸æ¬¡åªæä¸ä¸ªç¨æ·æ¶ï¼åºç¨å¼åå·²ç»å¾éº»ç¦äºï¼æè®¸å¤å¹¶åç¨æ·ä½¿å¾å®æ´å å°é¾ï¼å 为任ä½ä¸ä¸ªæ°æ®é½å¯è½éæ¶æ¹åã [^è¯æ³¨i]: è½¶äºï¼å¶ç¶åºç°çç¬æ¶éè¯¯ææ¶ç§°ä¸º ***Heisenbug***ï¼èç¡®å®æ§çé®é¢å¯¹åºå°ç§°ä¸º ***Bohrbugs*** åºäºè¿ä¸ªåå ï¼æ°æ®åºä¸ç´è¯å¾éè¿æä¾ **äºå¡é离ï¼transaction isolationï¼** æ¥éèåºç¨ç¨åºå¼åè çå¹¶åé®é¢ãä»ç论ä¸è®²ï¼é离å¯ä»¥éè¿åè£ æ²¡æå¹¶ååçï¼è®©ä½ ççæ´»æ´å è½»æ¾ï¼**å¯ä¸²è¡çï¼serializableï¼** é离ç级æå³çæ°æ®åºä¿è¯äºå¡çææå¦å串è¡è¿è¡ï¼å³ä¸æ¬¡ä¸ä¸ªï¼æ²¡æä»»ä½å¹¶åï¼ã å®é ä¸ä¸å¹¸çæ¯ï¼é离并没æé£ä¹ç®åã**å¯ä¸²è¡çé离** 伿æ§è½æå¤±ï¼è®¸å¤æ°æ®åºä¸æ¿ææ¯ä»è¿ä¸ªä»£ä»·ã8ããå æ¤ï¼ç³»ç»é常使ç¨è¾å¼±çéç¦»çº§å«æ¥é²æ¢ä¸é¨åï¼è䏿¯å ¨é¨çå¹¶åé®é¢ãè¿äºé离级å«é¾ä»¥çè§£ï¼å¹¶ä¸ä¼å¯¼è´å¾®å¦çé误ï¼ä½æ¯å®ä»¬ä»ç¶å¨å®è·µä¸è¢«ä½¿ç¨ã23ãã å¼±äºå¡é离级å«å¯¼è´çå¹¶åæ§é误ä¸ä» ä» æ¯ä¸ä¸ªç论é®é¢ãå®ä»¬é æäºå¾å¤çèµéæå¤±ã24,25ãï¼èè´¹äºè´¢å¡å®¡è®¡äººåçè°æ¥ã26ãï¼å¹¶å¯¼è´å®¢æ·æ°æ®è¢«ç ´åã27ããå ³äºè¿ç±»é®é¢çä¸ä¸ªæµè¡çè¯è®ºæ¯ âå¦æä½ æ£å¨å¤çè´¢å¡æ°æ®ï¼è¯·ä½¿ç¨ ACID æ°æ®åºï¼â ââ 使¯è¿ä¸ç¹æ²¡ææå°ãå³ä½¿æ¯å¾å¤æµè¡çå ³ç³»åæ°æ®åºç³»ç»ï¼éå¸¸è¢«è®¤ä¸ºæ¯ âACIDâï¼ä¹ä½¿ç¨å¼±é离级å«ï¼æä»¥å®ä»¬ä¹ä¸ä¸å®è½é²æ¢è¿äºé误çåçã æ¯èµ·ç²ç®å°ä¾èµå·¥å ·ï¼æä»¬éè¦å¯¹åå¨çåç§å¹¶åé®é¢ï¼ä»¥åå¦ä½é²æ¢è¿äºé®é¢ææ·±å ¥ççè§£ãç¶åå°±å¯ä»¥ä½¿ç¨æä»¬æææ¡çå·¥å ·æ¥æå»ºå¯é åæ£ç¡®çåºç¨ç¨åºã 卿¬èä¸ï¼æä»¬å°çå 个å¨å®è·µä¸ä½¿ç¨çå¼±ï¼**é串è¡ç**ï¼å³ nonserializableï¼é离级å«ï¼å¹¶è¯¦ç»è®¨è®ºåªç§ç«äºæ¡ä»¶å¯è½åçä¹å¯è½ä¸åçï¼ä»¥ä¾¿ä½ å¯ä»¥å³å®ä»ä¹çº§å«éåä½ çåºç¨ç¨åºã䏿¦æä»¬å®æäºè¿ä¸ªå·¥ä½ï¼æä»¬å°è¯¦ç»è®¨è®ºå¯ä¸²è¡åï¼è¯·åé â[å¯ä¸²è¡å](#å¯ä¸²è¡å)âï¼ãæä»¬è®¨è®ºçé离级å«å°æ¯éæ£å¼çï¼éè¿ç¤ºä¾æ¥è¿è¡ãå¦æä½ éè¦ä¸¥æ ¼çå®ä¹ååæå®ä»¬ç屿§ï¼ä½ å¯ä»¥å¨å¦æ¯æç®ä¸æ¾å°å®ä»¬ã28,29,30ãã ### 读已æäº¤ æåºæ¬çäºå¡éç¦»çº§å«æ¯ **读已æäº¤ï¼Read Committedï¼**[^v]ï¼å®æä¾äºä¸¤ä¸ªä¿è¯ï¼ 1. 仿°æ®åºè¯»æ¶ï¼åªè½çå°å·²æäº¤çæ°æ®ï¼æ²¡æ **è读**ï¼å³ dirty readsï¼ã 2. åå ¥æ°æ®åºæ¶ï¼åªä¼è¦çå·²ç»åå ¥çæ°æ®ï¼æ²¡æ **èå**ï¼å³ dirty writesï¼ã æä»¬æ¥æ´è¯¦ç»å°è®¨è®ºè¿ä¸¤ä¸ªä¿è¯ã [^v]: æäºæ°æ®åºæ¯æçè³æ´å¼±çé离级å«ï¼ç§°ä¸º **è¯»æªæäº¤ï¼Read uncommittedï¼**ãå®å¯ä»¥é²æ¢èåï¼ä½ä¸é²æ¢è读ã #### 没æè读 设æ³ä¸ä¸ªäºå¡å·²ç»å°ä¸äºæ°æ®åå ¥æ°æ®åºï¼ä½äºå¡è¿æ²¡ææäº¤æä¸æ¢ãå¦ä¸ä¸ªäºå¡å¯ä»¥çå°æªæäº¤çæ°æ®åï¼å¦ææ¯çè¯ï¼é£å°±å«å **è读ï¼dirty readsï¼**ã2ãã å¨ **读已æäº¤** é离级å«è¿è¡çäºå¡å¿ 须鲿¢è读ãè¿æå³çäºå¡çä»»ä½åå ¥æä½åªæå¨è¯¥äºå¡æäº¤æ¶æè½è¢«å ¶ä»äººçå°ï¼ç¶åææçåå ¥æä½é½ä¼ç«å³åå¾å¯è§ï¼ãå¦ [å¾ 7-4](img/fig7-4.png) æç¤ºï¼ç¨æ· 1 è®¾ç½®äº `x = 3`ï¼ä½ç¨æ· 2 ç `get x` 仿§è¿åæ§å¼ 2 ï¼å½ç¨æ· 1 å°æªæäº¤æ¶ï¼ã  **å¾ 7-4 没æè读ï¼ç¨æ· 2 åªæå¨ç¨æ· 1 çäºå¡å·²ç»æäº¤åæè½çå° x çæ°å¼ã** 为ä»ä¹è¦é²æ¢èè¯»ï¼æå 个åå ï¼ - 妿äºå¡éè¦æ´æ°å¤ä¸ªå¯¹è±¡ï¼è读åæå³çå¦ä¸ä¸ªäºå¡å¯è½ä¼åªçå°ä¸é¨åæ´æ°ãä¾å¦ï¼å¨ [å¾ 7-2](img/fig7-2.png) ä¸ï¼ç¨æ·çå°æ°çæªè¯»çµåé®ä»¶ï¼ä½çä¸å°æ´æ°ç计æ°å¨ãè¿å°±æ¯çµåé®ä»¶çè读ãçå°å¤äºé¨åæ´æ°ç¶æçæ°æ®åºä¼è®©ç¨æ·æå°å°æï¼å¹¶å¯è½å¯¼è´å ¶ä»äºå¡ååºé误çå³å®ã - 妿äºå¡ä¸æ¢ï¼åææåå ¥æä½é½éè¦åæ»ï¼å¦ [å¾ 7-3](img/fig7-3.png) æç¤ºï¼ãå¦ææ°æ®åºå 许è读ï¼é£å°±æå³çä¸ä¸ªäºå¡å¯è½ä¼çå°ç¨åéè¦åæ»çæ°æ®ï¼å³ä»æªå®é æäº¤ç»æ°æ®åºçæ°æ®ãæ³æ³åæå°±è®©äººå¤´å¤§ã #### 没æèå å¦æä¸¤ä¸ªäºå¡åæ¶å°è¯æ´æ°æ°æ®åºä¸çç¸å对象ï¼ä¼åçä»ä¹æ åµï¼æä»¬ä¸ç¥éåå ¥çé¡ºåºæ¯ææ ·çï¼ä½æ¯æä»¬é常认为åé¢çåå ¥ä¼è¦çåé¢çåå ¥ã 使¯ï¼å¦æå åçåå ¥æ¯å°æªæäº¤äºå¡çä¸é¨åï¼åä¼åçä»ä¹æ åµï¼åé¢çåå ¥ä¼è¦çä¸ä¸ªå°æªæäº¤çå¼ï¼è¿è¢«ç§°ä½ **èåï¼dirty writeï¼**ã28ããå¨ **读已æäº¤** çé离级å«ä¸è¿è¡çäºå¡å¿ 须鲿¢èåï¼é常æ¯å»¶è¿ç¬¬äºæ¬¡åå ¥ï¼ç´å°ç¬¬ä¸æ¬¡åå ¥äºå¡æäº¤æä¸æ¢ä¸ºæ¢ã éè¿é²æ¢èåï¼è¿ä¸ªé离级å«é¿å äºä¸äºå¹¶åé®é¢ï¼ - 妿äºå¡æ´æ°å¤ä¸ªå¯¹è±¡ï¼èåä¼å¯¼è´ä¸å¥½çç»æãä¾å¦ï¼èè [å¾ 7-5](img/fig7-5.png)ï¼ä»¥ä¸ä¸ªäºæè½¦éå®ç½ç«ä¸ºä¾ï¼Alice å Bob ä¸¤ä¸ªäººåæ¶è¯å¾è´ä¹°åä¸è¾è½¦ãè´ä¹°æ±½è½¦éè¦ä¸¤æ¬¡æ°æ®åºåå ¥ï¼ç½ç«ä¸çååå表éè¦æ´æ°ï¼ä»¥åæ ä¹°å®¶çè´ä¹°ï¼éå®å票éè¦åéç»ä¹°å®¶ãå¨ [å¾ 7-5](img/fig7-5.png) çæ åµä¸ï¼é宿¯å±äº Bob çï¼å ä¸ºä»æåæ´æ°äºååå表ï¼ï¼ä½å票å´å¯éç»äºç±ä¸½ä¸ï¼å 为她æåæ´æ°äºå票表ï¼ã读已æäº¤ä¼é»æ¢è¿æ ·çäºæ ã - 使¯ï¼è¯»å·²æäº¤å¹¶ä¸è½é²æ¢ [å¾ 7-1](img/fig7-1.png) ä¸ä¸¤ä¸ªè®¡æ°å¨å¢éä¹é´çç«äºç¶æãå¨è¿ç§æ åµä¸ï¼ç¬¬äºæ¬¡åå ¥åçå¨ç¬¬ä¸ä¸ªäºå¡æäº¤åï¼æä»¥å®ä¸æ¯ä¸ä¸ªèåãè¿ä»ç¶æ¯ä¸æ£ç¡®çï¼ä½æ¯åºäºä¸åçåå ï¼å¨ â[鲿¢æ´æ°ä¸¢å¤±](#鲿¢ä¸¢å¤±æ´æ°)â ä¸å°è®¨è®ºå¦ä½ä½¿è¿ç§è®¡æ°å¨å¢éå®å ¨ã  **å¾ 7-5 妿åå¨èåï¼æ¥èªä¸åäºå¡çå²çªåå ¥å¯è½ä¼æ··æ·å¨ä¸èµ·** #### å®ç°è¯»å·²æäº¤ **读已æäº¤** æ¯ä¸ä¸ªé常æµè¡çé离级å«ãè¿æ¯ Oracle 11gãPostgreSQLãSQL Server 2012ãMemSQL åå ¶ä»è®¸å¤æ°æ®åºçé»è®¤è®¾ç½®ã8ãã æå¸¸è§çæ 嵿¯ï¼æ°æ®åºéè¿ä½¿ç¨ **è¡éï¼row-level lockï¼** æ¥é²æ¢èåï¼å½äºå¡æ³è¦ä¿®æ¹ç¹å®å¯¹è±¡ï¼è¡æææ¡£ï¼æ¶ï¼å®å¿ é¡»é¦å è·å¾è¯¥å¯¹è±¡çéãç¶åå¿ é¡»ææè¯¥éç´å°äºå¡è¢«æäº¤æä¸æ¢ã䏿¬¡åªæä¸ä¸ªäºå¡å¯ææä»»ä½ç»å®å¯¹è±¡çéï¼å¦æå¦ä¸ä¸ªäºå¡è¦åå ¥åä¸ä¸ªå¯¹è±¡ï¼åå¿ é¡»çå°ç¬¬ä¸ä¸ªäºå¡æäº¤æä¸æ¢åï¼æè½è·å该éå¹¶ç»§ç»ãè¿ç§é宿¯è¯»å·²æäº¤æ¨¡å¼ï¼ææ´å¼ºçé离级å«ï¼çæ°æ®åºèªå¨å®æçã å¦ä½é²æ¢è读ï¼ä¸ç§éæ©æ¯ä½¿ç¨ç¸åçéï¼å¹¶è¦æ±ä»»ä½æ³è¦è¯»å对象çäºå¡æ¥ç®åå°è·å该éï¼ç¶åå¨è¯»åä¹åç«å³åæ¬¡éæ¾è¯¥éãè¿å°ç¡®ä¿å¨å¯¹è±¡å ·æèçãæªæäº¤ç弿¶ä¸ä¼åç读å(å ä¸ºå¨æ¤æé´ï¼éå°ç±è¿è¡åå ¥çäºå¡ææ)ã 使¯è¦æ±è¯»éçåæ³å¨å®è·µä¸ææå¹¶ä¸å¥½ãå 为ä¸ä¸ªé¿æ¶é´è¿è¡çåå ¥äºå¡ä¼è¿«ä½¿è®¸å¤åªè¯»äºå¡çå°è¿ä¸ªæ ¢åå ¥äºå¡å®æãè¿ä¼æå¤±åªè¯»äºå¡çååºæ¶é´ï¼å¹¶ä¸ä¸å©äºå¯æä½æ§ï¼å 为çå¾ éï¼åºç¨æä¸ªé¨åçè¿ç¼å¯è½ç±äºè¿éæåºï¼å¯¼è´å ¶ä»é¨ååºç°é®é¢ã åºäºè¿ä¸ªåå ï¼å¤§å¤æ°æ°æ®åº [^vi] ä½¿ç¨ [å¾ 7-4](img/fig7-4.png) çæ¹å¼é²æ¢è读ï¼å¯¹äºåå ¥çæ¯ä¸ªå¯¹è±¡ï¼æ°æ®åºé½ä¼è®°ä½æ§çå·²æäº¤å¼ï¼åç±å½åææåå ¥éçäºå¡è®¾ç½®çæ°å¼ãå½äºå¡æ£å¨è¿è¡æ¶ï¼ä»»ä½å ¶ä»è¯»å对象çäºå¡é½ä¼æ¿å°æ§å¼ã åªæå½æ°å¼æäº¤åï¼äºå¡æä¼åæ¢å°è¯»åæ°å¼ã [^vi]: 卿°åæ¬ææ¶ï¼å¯ä¸å¨è¯»å·²æäº¤é离级å«ä½¿ç¨è¯»éçä¸»æµæ°æ®åºæ¯ä½¿ç¨ `read_committed_snapshot = off` é ç½®ç IBM DB2 å Microsoft SQL Server ã23,36ãã ### å¿«ç §é离åå¯éå¤è¯» 妿åªä»è¡¨é¢ä¸ç读已æäº¤é离级å«ä½ 就认为å®å®æäºäºå¡æéçä¸åï¼è¿æ¯æ æå¯åçãå®å 许 **䏿¢**ï¼ååæ§çè¦æ±ï¼ï¼å®é²æ¢è¯»åä¸å®æ´çäºå¡ç»æï¼å¹¶ä¸é²æ¢å¹¶ååå ¥é æçæ··ä¹±ãäºå®ä¸è¿äºåè½é常æç¨ï¼æ¯èµ·æ²¡æäºå¡çç³»ç»æ¥ï¼å¯ä»¥æä¾æ´å¤çä¿è¯ã 使¯å¨ä½¿ç¨æ¤éç¦»çº§å«æ¶ï¼ä»ç¶æå¾å¤å°æ¹å¯è½ä¼äº§çå¹¶åé误ãä¾å¦ [å¾ 7-6](img/fig7-6.png) 说æäºè¯»å·²æäº¤æ¶å¯è½åççé®é¢ã  **å¾ 7-6 读ååå·®ï¼Alice è§å¯æ°æ®åºå¤äºä¸ä¸è´çç¶æ** ç±ä¸½ä¸å¨é¶è¡æ 1000 ç¾å çå¨èï¼å为两个账æ·ï¼æ¯ä¸ª 500 ç¾å ãç°å¨æä¸ç¬äºå¡ä»å¥¹çä¸ä¸ªè´¦æ·è½¬ç§»äº 100 ç¾å å°å¦ä¸ä¸ªè´¦æ·ã妿她é常ä¸å¹¸å°å¨äºå¡å¤ççè¿ç¨ä¸æ¥çå ¶è´¦æ·ä½é¢å表ï¼å¥¹å¯è½ä¼å¨æ¶å°ä»æ¬¾ä¹åå çå°ä¸ä¸ªè´¦æ·çä½é¢ï¼æ¶æ¬¾è´¦æ·ï¼ä½é¢ä»ä¸º 500 ç¾å ï¼ï¼å¨ååºè½¬è´¦ä¹ååçå°å¦ä¸ä¸ªè´¦æ·çä½é¢ï¼ä»æ¬¾è´¦æ·ï¼æ°ä½é¢ä¸º 400 ç¾å ï¼ã对ç±ä¸½ä¸æ¥è¯´ï¼ç°å¨å¥¹çè´¦æ·ä¼¼ä¹æ»å ±åªæ 900 ç¾å ââ çèµ·æ¥æ 100 ç¾å å·²ç»å空æ¶å¤±äºã è¿ç§å¼å¸¸è¢«ç§°ä¸º **ä¸å¯éå¤è¯»ï¼nonrepeatable readï¼** æ **读ååå·®ï¼read skewï¼**ï¼å¦æ Alice å¨äºå¡ç»ææ¶å次读åè´¦æ· 1 çä½é¢ï¼å¥¹å°çå°ä¸å¥¹ä¹åçæ¥è¯¢ä¸çå°çä¸åçå¼ï¼600 ç¾å ï¼ãå¨è¯»å·²æäº¤çé离æ¡ä»¶ä¸ï¼**ä¸å¯éå¤è¯»** 被认为æ¯å¯æ¥åçï¼Alice çå°ç叿·ä½é¢æ¶ç¡®å®å¨é 读æ¶å·²ç»æäº¤äºã > ä¸å¹¸çæ¯ï¼æ¯è¯ **åå·®ï¼skewï¼** è¿ä¸ªè¯æ¯è¿è½½çï¼ä»¥å使ç¨å®æ¯å 为çç¹çä¸å¹³è¡¡å·¥ä½éï¼è¯·åé â[è´è½½åæä¸çç¹æ¶é¤](ch6.md#è´è½½åæä¸çç¹æ¶é¤)âï¼ï¼èè¿éåå·®æå³çå¼å¸¸çæ¶åºã å¯¹äº Alice çæ åµï¼è¿ä¸æ¯ä¸ä¸ªé¿ææç»çé®é¢ãå ä¸ºå¦æå¥¹å ç§éåå·æ°é¶è¡ç½ç«ç页é¢ï¼å¥¹å¾å¯è½ä¼çå°ä¸è´ç叿·ä½é¢ã使¯æäºæ åµä¸ï¼ä¸è½å®¹å¿è¿ç§ææ¶çä¸ä¸è´ï¼ * å¤ä»½ è¿è¡å¤ä»½éè¦å¤å¶æ´ä¸ªæ°æ®åºï¼å¯¹å¤§åæ°æ®åºèè¨å¯è½éè¦è±è´¹æ°å°æ¶æè½å®æãå¤ä»½è¿ç¨è¿è¡æ¶ï¼æ°æ®åºä»ç¶ä¼æ¥ååå ¥æä½ãå æ¤å¤ä»½å¯è½ä¼å å«ä¸äºæ§çé¨ååä¸äºæ°çé¨åã妿ä»è¿æ ·çå¤ä»½ä¸æ¢å¤ï¼é£ä¹ä¸ä¸è´ï¼å¦æ¶å¤±çé±ï¼å°±ä¼åææ°¸ä¹ çã * åææ¥è¯¢å宿´æ§æ£æ¥ ææ¶ï¼ä½ å¯è½éè¦è¿è¡ä¸ä¸ªæ¥è¯¢ï¼æ«æå¤§é¨åçæ°æ®åºãè¿æ ·çæ¥è¯¢å¨åæä¸å¾å¸¸è§ï¼è¯·åé â[äºå¡å¤çè¿æ¯åæï¼](ch3.md#äºå¡å¤çè¿æ¯åæï¼)âï¼ï¼ä¹å¯è½æ¯å®æå®æ´æ§æ£æ¥ï¼å³çè§æ°æ®æåï¼çä¸é¨åã妿è¿äºæ¥è¯¢å¨ä¸åæ¶é´ç¹è§å¯æ°æ®åºçä¸åé¨åï¼åå¯è½ä¼è¿åæ¯«æ æä¹çç»æã **å¿«ç §é离ï¼snapshot isolationï¼**ã28ãæ¯è¿ä¸ªé®é¢æå¸¸è§çè§£å³æ¹æ¡ãæ³æ³æ¯ï¼æ¯ä¸ªäºå¡é½ä»æ°æ®åºç **ä¸è´å¿«ç §ï¼consistent snapshotï¼** ä¸è¯»å ââ ä¹å°±æ¯è¯´ï¼äºå¡å¯ä»¥çå°äºå¡å¼å§æ¶å¨æ°æ®åºä¸æäº¤çæææ°æ®ãå³ä½¿è¿äºæ°æ®éå被å¦ä¸ä¸ªäºå¡æ´æ¹ï¼æ¯ä¸ªäºå¡ä¹åªè½çå°è¯¥ç¹å®æ¶é´ç¹çæ§æ°æ®ã å¿«ç §éç¦»å¯¹é¿æ¶é´è¿è¡çåªè¯»æ¥è¯¢ï¼å¦å¤ä»½ååæï¼é常æç¨ã妿æ¥è¯¢çæ°æ®å¨æ¥è¯¢æ§è¡çåæ¶åçååï¼åå¾é¾çè§£æ¥è¯¢çå«ä¹ãå½ä¸ä¸ªäºå¡å¯ä»¥çå°æ°æ®åºå¨æä¸ªç¹å®æ¶é´ç¹å»ç»æ¶çä¸è´å¿«ç §ï¼ç解起æ¥å°±å¾å®¹æäºã å¿«ç §é离æ¯ä¸ä¸ªæµè¡çåè½ï¼PostgreSQLãä½¿ç¨ InnoDB 弿ç MySQLãOracleãSQL Server ç齿¯æã23,31,32ãã #### å®ç°å¿«ç §é离 ä¸è¯»åæäº¤çé离类似ï¼å¿«ç §é离çå®ç°é常使ç¨å鿥鲿¢èåï¼è¯·åé â[读已æäº¤](#读已æäº¤)âï¼ï¼è¿æå³çè¿è¡åå ¥çäºå¡ä¼é»æ¢å¦ä¸ä¸ªäºå¡ä¿®æ¹åä¸ä¸ªå¯¹è±¡ã使¯è¯»åä¸éè¦ä»»ä½éå®ã仿§è½çè§åº¦æ¥çï¼å¿«ç §é离çä¸ä¸ªå ³é®å忝ï¼**读ä¸é»å¡åï¼åä¸é»å¡è¯»**ãè¿å è®¸æ°æ®åºå¨å¤çä¸è´æ§å¿«ç §ä¸çé¿æ¶é´æ¥è¯¢æ¶ï¼å¯ä»¥æ£å¸¸å°åæ¶å¤çåå ¥æä½ãä¸ä¸¤è é´æ²¡æä»»ä½éå®äºç¨ã 为äºå®ç°å¿«ç §éç¦»ï¼æ°æ®åºä½¿ç¨äºæä»¬çå°çç¨äºé²æ¢ [å¾ 7-4](img/fig7-4.png) ä¸çèè¯»çæºå¶çä¸è¬åãæ°æ®åºå¿ é¡»å¯è½ä¿çä¸ä¸ªå¯¹è±¡çå 个ä¸åçæäº¤çæ¬ï¼å 为åç§æ£å¨è¿è¡çäºå¡å¯è½éè¦çå°æ°æ®åºå¨ä¸åçæ¶é´ç¹çç¶æãå 为å®åæ¶ç»´æ¤çå个对象çå¤ä¸ªçæ¬ï¼æä»¥è¿ç§ææ¯è¢«ç§°ä¸º **å¤çæ¬å¹¶åæ§å¶ï¼MVCC, multi-version concurrency controlï¼**ã 妿ä¸ä¸ªæ°æ®åºåªéè¦æä¾ **读已æäº¤** çé离级å«ï¼èä¸æä¾ **å¿«ç §é离**ï¼é£ä¹ä¿çä¸ä¸ªå¯¹è±¡çä¸¤ä¸ªçæ¬å°±è¶³å¤äºï¼æäº¤ççæ¬å被è¦çä½å°æªæäº¤ççæ¬ãæ¯æå¿«ç §é离çåå¨å¼æé常ä¹ä½¿ç¨ MVCC æ¥å®ç° **读已æäº¤** é离级å«ãä¸ç§å ¸åçæ¹æ³æ¯ **读已æäº¤** 为æ¯ä¸ªæ¥è¯¢ä½¿ç¨åç¬çå¿«ç §ï¼è **å¿«ç §é离** 对æ´ä¸ªäºå¡ä½¿ç¨ç¸åçå¿«ç §ã [å¾ 7-7](img/fig7-7.png) 说æäºå¦ä½å¨ PostgreSQL ä¸å®ç°åºäº MVCC çå¿«ç §é离ã31ãï¼å ¶ä»å®ç°ç±»ä¼¼ï¼ãå½ä¸ä¸ªäºå¡å¼å§æ¶ï¼å®è¢«èµäºä¸ä¸ªå¯ä¸çï¼æ°¸è¿å¢é¿ [^vii] çäºå¡ IDï¼`txid`ï¼ãæ¯å½äºå¡åæ°æ®åºåå ¥ä»»ä½å 容æ¶ï¼å®æåå ¥çæ°æ®é½ä¼è¢«æ è®°ä¸åå ¥è çäºå¡ IDã [^vii]: äºå®ä¸ï¼äºå¡ ID æ¯ 32 使´æ°ï¼æä»¥å¤§çº¦ä¼å¨ 40 亿次äºå¡ä¹å溢åºã PostgreSQL ç Vacuum è¿ç¨ä¼æ¸ çèæ§çäºå¡ IDï¼ç¡®ä¿äºå¡ ID 溢åºï¼åå·ï¼ä¸ä¼å½±åå°æ°æ®ã  **å¾ 7-7 使ç¨å¤çæ¬å¯¹è±¡å®ç°å¿«ç §é离** 表ä¸çæ¯ä¸è¡é½æä¸ä¸ª `created_by` åæ®µï¼å ¶ä¸å å«å°è¯¥è¡æå ¥å°è¡¨ä¸ççäºå¡ IDãæ¤å¤ï¼æ¯è¡é½æä¸ä¸ª `deleted_by` åæ®µï¼æåæ¯ç©ºçã妿æä¸ªäºå¡å é¤äºä¸è¡ï¼é£ä¹è¯¥è¡å®é ä¸å¹¶æªä»æ°æ®åºä¸å é¤ï¼èæ¯éè¿å° `deleted_by` åæ®µè®¾ç½®ä¸ºè¯·æ±å é¤çäºå¡ç ID æ¥æ 记为å é¤ãå¨ç¨åçæ¶é´ï¼å½ç¡®å®æ²¡æäºå¡å¯ä»¥å访é®å·²å é¤çæ°æ®æ¶ï¼æ°æ®åºä¸çå徿¶éè¿ç¨ä¼å°ææå¸¦æå 餿 è®°çè¡ç§»é¤ï¼å¹¶éæ¾å ¶ç©ºé´ã[^è¯æ³¨ii] [^è¯æ³¨ii]: å¨ PostgreSQL ä¸ï¼`created_by` çå®é å称为 `xmin`ï¼`deleted_by` çå®é å称为 `xmax` `UPDATE` æä½å¨å é¨ç¿»è¯ä¸º `DELETE` å `INSERT` ãä¾å¦ï¼å¨ [å¾ 7-7](img/fig7-7.png) ä¸ï¼äºå¡ 13 ä»è´¦æ· 2 䏿£é¤ 100 ç¾å ï¼å°ä½é¢ä» 500 ç¾å æ¹ä¸º 400 ç¾å ãå®é ä¸å å«ä¸¤æ¡è´¦æ· 2 çè®°å½ï¼ä½é¢ä¸º \$500 çè¡è¢«æ 记为 **被äºå¡ 13 å é¤**ï¼ä½é¢ä¸º \$400 çè¡ **ç±äºå¡ 13 å建**ã #### è§å¯ä¸è´æ§å¿«ç §çå¯è§æ§è§å å½ä¸ä¸ªäºå¡ä»æ°æ®åºä¸è¯»åæ¶ï¼äºå¡ ID ç¨äºå³å®å®å¯ä»¥çè§åªäºå¯¹è±¡ï¼çä¸è§åªäºå¯¹è±¡ãéè¿ä»ç»å®ä¹å¯è§æ§è§åï¼æ°æ®åºå¯ä»¥ååºç¨ç¨åºåç°ä¸è´çæ°æ®åºå¿«ç §ãå·¥ä½å¦ä¸ï¼ 1. 卿¯æ¬¡äºå¡å¼å§æ¶ï¼æ°æ®åºååºå½æ¶ææå ¶ä»ï¼å°æªæäº¤æå°æªä¸æ¢ï¼çäºå¡æ¸ åï¼å³ä½¿ä¹åæäº¤äºï¼è¿äºäºå¡å·²æ§è¡çä»»ä½åå ¥ä¹é½ä¼è¢«å¿½ç¥ã 2. è¢«ä¸æ¢äºå¡ææ§è¡çä»»ä½åå ¥é½å°è¢«å¿½ç¥ã 3. ç±å ·æè¾æäºå¡ IDï¼å³ï¼å¨å½åäºå¡å¼å§ä¹åå¼å§çï¼çäºå¡æåçä»»ä½åå ¥é½è¢«å¿½ç¥ï¼èä¸ç®¡è¿äºäºå¡æ¯å¦å·²ç»æäº¤ã 4. ææå ¶ä»åå ¥ï¼å¯¹åºç¨é½æ¯å¯è§çã è¿äºè§åéç¨äºå建åå é¤å¯¹è±¡ãå¨ [å¾ 7-7](img/fig7-7.png) ä¸ï¼å½äºå¡ 12 ä»è´¦æ· 2 è¯»åæ¶ï¼å®ä¼çå° \$500 çä½é¢ï¼å 为 \$500 ä½é¢çå 餿¯ç±äºå¡ 13 宿çï¼æ ¹æ®è§å 3ï¼äºå¡ 12 çä¸å°äºå¡ 13 æ§è¡çå é¤ï¼ï¼ä¸ 400 ç¾å è®°å½çåå»ºä¹æ¯ä¸å¯è§çï¼æç §ç¸åçè§åï¼ã æ¢å¥è¯è¯´ï¼å¦æä»¥ä¸ä¸¤ä¸ªæ¡ä»¶é½æç«ï¼åå¯è§ä¸ä¸ªå¯¹è±¡ï¼ - 读äºå¡å¼å§æ¶ï¼å建该对象çäºå¡å·²ç»æäº¤ã - 对象æªè¢«æ 记为å é¤ï¼æå¦æè¢«æ 记为å é¤ï¼è¯·æ±å é¤çäºå¡å¨è¯»äºå¡å¼å§æ¶å°æªæäº¤ã é¿æ¶é´è¿è¡çäºå¡å¯è½ä¼é¿æ¶é´ä½¿ç¨å¿«ç §ï¼å¹¶ç»§ç»è¯»åï¼ä»å ¶ä»äºå¡çè§åº¦æ¥çï¼æ©å·²è¢«è¦çæå é¤çå¼ãç±äºä»æ¥ä¸åå°æ´æ°å¼ï¼èæ¯æ¯æ¬¡å¼æ¹åæ¶å建ä¸ä¸ªæ°ççæ¬ï¼æ°æ®åºå¯ä»¥å¨æä¾ä¸è´å¿«ç §çåæ¶åªäº§çå¾å°çé¢å¤å¼éã #### ç´¢å¼åå¿«ç §é离 ç´¢å¼å¦ä½å¨å¤çæ¬æ°æ®åºä¸å·¥ä½ï¼ä¸ç§éæ©æ¯ä½¿ç´¢å¼ç®åå°æåå¯¹è±¡çææçæ¬ï¼å¹¶ä¸éè¦ç´¢å¼æ¥è¯¢æ¥è¿æ»¤æå½åäºå¡ä¸å¯è§çä»»ä½å¯¹è±¡çæ¬ãå½å徿¶éå é¤ä»»ä½äºå¡ä¸åå¯è§çæ§å¯¹è±¡çæ¬æ¶ï¼ç¸åºçç´¢å¼æ¡ç®ä¹å¯ä»¥è¢«å é¤ã å¨å®è·µä¸ï¼è®¸å¤å®ç°ç»èå³å®äºå¤çæ¬å¹¶åæ§å¶çæ§è½ãä¾å¦ï¼å¦æåä¸å¯¹è±¡çä¸åçæ¬å¯ä»¥æ¾å ¥åä¸ä¸ªé¡µé¢ä¸ï¼PostgreSQL çä¼åå¯ä»¥é¿å æ´æ°ç´¢å¼ã31ãã å¨ CouchDBãDatomic å LMDB ä¸ä½¿ç¨å¦ä¸ç§æ¹æ³ãè½ç¶å®ä»¬ä¹ä½¿ç¨ [B æ ](ch3.md#Bæ )ï¼ä½å®ä»¬ä½¿ç¨çæ¯ä¸ç§ **ä» è¿½å / åæ¶æ·è´ï¼append-only/copy-on-writeï¼** çåä½ï¼å®ä»¬å¨æ´æ°æ¶ä¸è¦çæ ç页é¢ï¼è为æ¯ä¸ªä¿®æ¹é¡µé¢å建ä¸ä»½å¯æ¬ãä»ç¶é¡µé¢ç´å°æ æ ¹é½ä¼çº§èæ´æ°ï¼ä»¥æåå®ä»¬å页é¢çæ°çæ¬ãä»»ä½ä¸ååå ¥å½±åç页é¢é½ä¸éè¦è¢«å¤å¶ï¼å¹¶ä¸ä¿æä¸åã33,34,35ãã 使ç¨ä» 追å ç B æ ï¼æ¯ä¸ªåå ¥äºå¡ï¼æä¸æ¹äºå¡ï¼é½ä¼å建ä¸é¢æ°ç B æ ï¼å½å建æ¶ï¼ä»è¯¥ç¹å®æ æ ¹çé¿çæ å°±æ¯æ°æ®åºçä¸ä¸ªä¸è´æ§å¿«ç §ãæ²¡å¿ è¦æ ¹æ®äºå¡ ID è¿æ»¤æå¯¹è±¡ï¼å 为åç»åå ¥ä¸è½ä¿®æ¹ç°æç B æ ï¼å®ä»¬åªè½å建æ°çæ æ ¹ãä½è¿ç§æ¹æ³ä¹éè¦ä¸ä¸ªè´è´£å缩åå徿¶éçåå°è¿ç¨ã #### å¯éå¤è¯»ä¸å½åæ··æ· å¿«ç §é离æ¯ä¸ä¸ªæç¨çé离级å«ï¼ç¹å«å¯¹äºåªè¯»äºå¡èè¨ã使¯ï¼è®¸å¤æ°æ®åºå®ç°äºå®ï¼å´ç¨ä¸åçååæ¥ç§°å¼ãå¨ Oracle ä¸ç§°ä¸º **å¯ä¸²è¡åï¼Serializableï¼** çï¼å¨ PostgreSQL å MySQL ä¸ç§°ä¸º **å¯éå¤è¯»ï¼repeatable readï¼**ã23ãã è¿ç§å½åæ··æ·çåå æ¯ SQL æ åæ²¡æ **å¿«ç §é离** çæ¦å¿µï¼å 为æ 忝åºäº System R 1975 å¹´å®ä¹çé离级å«ã2ãï¼é£æ¶å **å¿«ç §é离** å°æªåæãç¸åï¼å®å®ä¹äº **å¯éå¤è¯»**ï¼è¡¨é¢ä¸çèµ·æ¥ä¸å¿«ç §é离å¾ç¸ä¼¼ã PostgreSQL å MySQL ç§°å ¶ **å¿«ç §é离** 级å«ä¸º **å¯éå¤è¯»ï¼repeatable readï¼**ï¼å ä¸ºè¿æ ·ç¬¦åæ åè¦æ±ï¼æä»¥å®ä»¬å¯ä»¥å£°ç§°èªå·± âæ åå ¼å®¹âã ä¸å¹¸çæ¯ï¼SQL æ å对é离级å«çå®ä¹æ¯æç¼ºé·ç ââ æ¨¡ç³ï¼ä¸ç²¾ç¡®ï¼å¹¶ä¸åæ ååºæçæ ·åç¬ç«äºå®ç°ã28ããæå ä¸ªæ°æ®åºå®ç°äºå¯éå¤è¯»ï¼ä½å®ä»¬å®é æä¾çä¿è¯åå¨å¾å¤§çå·®å¼ï¼å°½ç®¡è¡¨é¢ä¸æ¯æ ååçã23ããå¨ç ç©¶æç®ã29,30ãä¸å·²ç»æäºå¯éå¤è¯»çæ£å¼å®ä¹ï¼ä½å¤§å¤æ°çå®ç°å¹¶ä¸è½æ»¡è¶³è¿ä¸ªæ£å¼å®ä¹ãæåï¼IBM DB2 ä½¿ç¨ âå¯éå¤è¯»â æ¥å¼ç¨å¯ä¸²è¡åã8ãã ç»æï¼æ²¡æäººçæ£ç¥é **å¯éå¤è¯»** çææã ### 鲿¢ä¸¢å¤±æ´æ° å°ç®å为æ¢å·²ç»è®¨è®ºç **读已æäº¤** å **å¿«ç §é离** 级å«ï¼ä¸»è¦ä¿è¯äº **åªè¯»äºå¡å¨å¹¶ååå ¥æ¶** å¯ä»¥çå°ä»ä¹ãå´å¿½ç¥äºä¸¤ä¸ªäºå¡å¹¶ååå ¥çé®é¢ ââ æä»¬åªè®¨è®ºäºèåï¼è¯·åé â[没æèå](#没æèå)âï¼ï¼ä¸ç§ç¹å®ç±»åçå - åå²çªæ¯å¯è½åºç°çã å¹¶åçåå ¥äºå¡ä¹é´è¿æå ¶ä»å ç§æè¶£çå²çªãå ¶ä¸æçåçæ¯ **ä¸¢å¤±æ´æ°ï¼lost updateï¼** é®é¢ï¼å¦ [å¾ 7-1](img/fig7-1.png) æç¤ºï¼ä»¥ä¸¤ä¸ªå¹¶å计æ°å¨å¢é为ä¾ã 妿åºç¨ä»æ°æ®åºä¸è¯»åä¸äºå¼ï¼ä¿®æ¹å®å¹¶ååä¿®æ¹çå¼ï¼è¯»å - ä¿®æ¹ - åå ¥åºåï¼ï¼åå¯è½ä¼åçä¸¢å¤±æ´æ°çé®é¢ãå¦æä¸¤ä¸ªäºå¡åæ¶æ§è¡ï¼åå ¶ä¸ä¸ä¸ªçä¿®æ¹å¯è½ä¼ä¸¢å¤±ï¼å 为第äºä¸ªåå ¥çå 容并没æå æ¬ç¬¬ä¸ä¸ªäºå¡çä¿®æ¹ï¼ææ¶ä¼è¯´åé¢åå ¥ **ç æï¼clobberï¼** äºåé¢çåå ¥ï¼è¿ç§æ¨¡å¼åçå¨åç§ä¸åçæ åµä¸ï¼ - å¢å 计æ°å¨ææ´æ°è´¦æ·ä½é¢ï¼éè¦è¯»åå½åå¼ï¼è®¡ç®æ°å¼å¹¶ååæ´æ°åçå¼ï¼ - å¨å¤æå¼ä¸è¿è¡æ¬å°ä¿®æ¹ï¼ä¾å¦ï¼å°å ç´ æ·»å å° JSON ææ¡£ä¸çä¸ä¸ªå表ï¼éè¦è§£æææ¡£ï¼è¿è¡æ´æ¹å¹¶ååä¿®æ¹çææ¡£ï¼ - ä¸¤ä¸ªç¨æ·åæ¶ç¼è¾ wiki 页é¢ï¼æ¯ä¸ªç¨æ·éè¿å°æ´ä¸ªé¡µé¢å 容åéå°æå¡å¨æ¥ä¿åå ¶æ´æ¹ï¼è¦åæ°æ®åºä¸å½åçä»»ä½å 容ã è¿æ¯ä¸ä¸ªæ®éçé®é¢ï¼æä»¥å·²ç»å¼åäºåç§è§£å³æ¹æ¡ã #### ååå è®¸å¤æ°æ®åºæä¾äºååæ´æ°æä½ï¼ä»èæ¶é¤äºå¨åºç¨ç¨åºä»£ç 䏿§è¡è¯»å - ä¿®æ¹ - åå ¥åºåçéè¦ãå¦æä½ ç代ç å¯ä»¥ç¨è¿äºæä½æ¥è¡¨è¾¾ï¼é£è¿éå¸¸æ¯æå¥½çè§£å³æ¹æ¡ãä¾å¦ï¼ä¸é¢çæä»¤å¨å¤§å¤æ°å ³ç³»æ°æ®åºä¸æ¯å¹¶åå®å ¨çï¼ ```sql UPDATE counters SET value = value + 1 WHERE key = 'foo'; ``` 类似å°ï¼å MongoDB è¿æ ·çææ¡£æ°æ®åºæä¾äºå¯¹ JSON ææ¡£çä¸é¨åè¿è¡æ¬å°ä¿®æ¹çååæä½ï¼Redis æä¾äºä¿®æ¹æ°æ®ç»æï¼å¦ä¼å 级éåï¼çååæä½ã并䏿¯ææçåæä½é½å¯ä»¥ç¨ååæä½çæ¹å¼æ¥è¡¨è¾¾ï¼ä¾å¦ç»´åºé¡µé¢çæ´æ°æ¶åå°ä»»æææ¬ç¼è¾ [^viii]ï¼ä½æ¯å¨å¯ä»¥ä½¿ç¨ååæä½çæ åµä¸ï¼å®ä»¬éå¸¸æ¯æå¥½çéæ©ã [^viii]: å°ææ¬ææ¡£çç¼è¾è¡¨ç¤ºä¸ºååçååæµæ¯å¯è½çï¼å°½ç®¡ç¸å½å¤æã请åé â[èªå¨å²çªè§£å³](ch5.md#èªå¨å²çªè§£å³)âã ååæä½é常éè¿å¨è¯»å对象æ¶ï¼è·åå ¶ä¸çæå®éæ¥å®ç°ãä»¥ä¾¿æ´æ°å®æä¹å没æå ¶ä»äºå¡å¯ä»¥è¯»åå®ãè¿ç§ææ¯ææ¶è¢«ç§°ä¸º **游æ ç¨³å®æ§ï¼cursor stabilityï¼**ã36,37ããå¦ä¸ä¸ªéæ©æ¯ç®åå°å¼ºå¶ææçååæä½å¨åä¸çº¿ç¨ä¸æ§è¡ã ä¸å¹¸çæ¯ï¼ORM æ¡æ¶å¾å®¹ææå¤å°æ§è¡ä¸å®å ¨ç读å - ä¿®æ¹ - åå ¥åºåï¼è䏿¯ä½¿ç¨æ°æ®åºæä¾çååæä½ã38ããå¦æä½ ç¥éèªå·±å¨åä»ä¹é£å½ç¶ä¸æ¯é®é¢ï¼ä½å®ç»å¸¸äº§çé£ç§å¾é¾æµåºæ¥çå¾®å¦ Bugã #### æ¾å¼éå® å¦ææ°æ®åºçå ç½®ååæä½æ²¡ææä¾å¿ è¦çåè½ï¼é²æ¢ä¸¢å¤±æ´æ°çå¦ä¸ä¸ªéæ©æ¯è®©åºç¨ç¨åºæ¾å¼å°éå®å°è¦æ´æ°ç对象ãç¶ååºç¨ç¨åºå¯ä»¥æ§è¡è¯»å - ä¿®æ¹ - åå ¥åºåï¼å¦æä»»ä½å ¶ä»äºå¡å°è¯åæ¶è¯»ååä¸ä¸ªå¯¹è±¡ï¼å强å¶çå¾ ï¼ç´å°ç¬¬ä¸ä¸ª **读å - ä¿®æ¹ - åå ¥åºå** 宿ã ä¾å¦ï¼èèä¸ä¸ªå¤äººæ¸¸æï¼å ¶ä¸å 个ç©å®¶å¯ä»¥åæ¶ç§»å¨ç¸åçæ£åãå¨è¿ç§æ åµä¸ï¼ä¸ä¸ªååæä½å¯è½æ¯ä¸å¤çï¼å 为åºç¨ç¨åºè¿éè¦ç¡®ä¿ç©å®¶çç§»å¨ç¬¦å游æè§åï¼è¿å¯è½æ¶åå°ä¸äºä¸è½åçå°ç¨æ°æ®åºæ¥è¯¢å®ç°çé»è¾ãä½ä½ å¯ä»¥ä½¿ç¨éæ¥é²æ¢ä¸¤åç©å®¶åæ¶ç§»å¨ç¸åçæ£åï¼å¦ä¾ 7-1 æç¤ºã **ä¾ 7-1 æ¾å¼éå®è¡ä»¥é²æ¢ä¸¢å¤±æ´æ°** ```plsql BEGIN TRANSACTION; SELECT * FROM figures WHERE name = 'robot' AND game_id = 222 FOR UPDATE; -- æ£æ¥ç©å®¶çæä½æ¯å¦ææï¼ç¶åæ´æ°å å SELECT è¿åæ£åçä½ç½®ã UPDATE figures SET position = 'c4' WHERE id = 1234; COMMIT; ``` - `FOR UPDATE` åå¥åè¯æ°æ®åºåºè¯¥å¯¹è¯¥æ¥è¯¢è¿åçææè¡å éã è¿æ¯ææçï¼ä½è¦å对ï¼ä½ éè¦ä»ç»èèåºç¨é»è¾ãå¿è®°å¨ä»£ç æå¤å éå¾å®¹æå¼å ¥ç«äºæ¡ä»¶ã #### èªå¨æ£æµä¸¢å¤±çæ´æ° ååæä½å鿝éè¿å¼ºå¶ **读å - ä¿®æ¹ - åå ¥åºå** æé¡ºåºåçï¼æ¥é²æ¢ä¸¢å¤±æ´æ°çæ¹æ³ãå¦ä¸ç§æ¹æ³æ¯å 许å®ä»¬å¹¶è¡æ§è¡ï¼å¦æäºå¡ç®¡ç卿£æµå°ä¸¢å¤±æ´æ°ï¼å䏿¢äºå¡å¹¶å¼ºå¶å®ä»¬éè¯å ¶ **读å - ä¿®æ¹ - åå ¥åºå**ã è¿ç§æ¹æ³çä¸ä¸ªä¼ç¹æ¯ï¼æ°æ®åºå¯ä»¥ç»åå¿«ç §éç¦»é«æå°æ§è¡æ¤æ£æ¥ãäºå®ä¸ï¼PostgreSQL çå¯éå¤è¯»ï¼Oracle çå¯ä¸²è¡åå SQL Server çå¿«ç §é离级å«ï¼é½ä¼èªå¨æ£æµå°ä¸¢å¤±æ´æ°ï¼å¹¶ä¸æ¢æ¹éº»ç¦çäºå¡ã使¯ï¼MySQL/InnoDB çå¯éå¤è¯»å¹¶ä¸ä¼æ£æµ **ä¸¢å¤±æ´æ°**ã23ããä¸äºä½è ã28,30ãè®¤ä¸ºï¼æ°æ®åºå¿ é¡»è½é²æ¢ä¸¢å¤±æ´æ°æç§°å¾ä¸æ¯æä¾äº **å¿«ç §é离**ï¼æä»¥å¨è¿ä¸ªå®ä¹ä¸ï¼MySQL ä¸ä¸æä¾å¿«ç §é离ã ä¸¢å¤±æ´æ°æ£æµæ¯ä¸ä¸ªå¾å¥½çåè½ï¼å 为å®ä¸éè¦åºç¨ä»£ç 使ç¨ä»»ä½ç¹æ®çæ°æ®åºåè½ï¼ä½ å¯è½ä¼å¿è®°ä½¿ç¨éæååæä½ï¼ä»èå¼å ¥é误ï¼ä½ä¸¢å¤±æ´æ°çæ£æµæ¯èªå¨åççï¼å æ¤ä¸å¤ªå®¹æåºéã #### æ¯è¾å¹¶è®¾ç½®ï¼CASï¼ å¨ä¸æä¾äºå¡çæ°æ®åºä¸ï¼ææ¶ä¼åç°ä¸ç§ååæä½ï¼**æ¯è¾å¹¶è®¾ç½®**ï¼CAS, å³ Compare And Setï¼å åå¨ â[å对象åå ¥](#å对象åå ¥)â 䏿å°ï¼ãæ¤æä½çç®çæ¯ä¸ºäºé¿å ä¸¢å¤±æ´æ°ï¼åªæå½åå¼ä»ä¸æ¬¡è¯»åæ¶ä¸ç´æªæ¹åï¼æå è®¸æ´æ°åçã妿å½åå¼ä¸å å读åçå¼ä¸å¹é ï¼åæ´æ°ä¸èµ·ä½ç¨ï¼ä¸å¿ é¡»éè¯è¯»å - ä¿®æ¹ - åå ¥åºåã ä¾å¦ï¼ä¸ºäºé²æ¢ä¸¤ä¸ªç¨æ·åæ¶æ´æ°åä¸ä¸ª wiki 页é¢ï¼å¯ä»¥å°è¯ç±»ä¼¼è¿æ ·çæ¹å¼ï¼åªæå½ç¨æ·å¼å§ç¼è¾é¡µé¢å 容æ¶ï¼æä¼åçæ´æ°ï¼ ```sql -- æ ¹æ®æ°æ®åºçå®ç°æ åµï¼è¿å¯è½å®å ¨ä¹å¯è½ä¸å®å ¨ UPDATE wiki_pages SET content = 'æ°å 容' WHERE id = 1234 AND content = 'æ§å 容'; ``` 妿å å®¹å·²ç»æ´æ¹å¹¶ä¸ä¸åä¸ âæ§å 容â ç¸å¹é ï¼åæ¤æ´æ°å°ä¸èµ·ä½ç¨ï¼å æ¤ä½ éè¦æ£æ¥æ´æ°æ¯å¦çæï¼å¿ è¦æ¶éè¯ã使¯ï¼å¦ææ°æ®åºå 许 `WHERE` åå¥ä»æ§å¿«ç §ä¸è¯»åï¼åæ¤è¯å¥å¯è½æ æ³é²æ¢ä¸¢å¤±æ´æ°ï¼å 为å³ä½¿åçäºå¦ä¸ä¸ªå¹¶ååå ¥ï¼`WHERE` æ¡ä»¶ä¹å¯è½ä¸ºçãå¨ä¾èµæ°æ®åºç CAS æä½åè¦æ£æ¥å ¶æ¯å¦å®å ¨ã #### å²çªè§£å³åå¤å¶ å¨å¤å¶æ°æ®åºä¸ï¼è¯·åé [第äºç« ](ch5.md)ï¼ï¼é²æ¢ä¸¢å¤±çæ´æ°éè¦èèå¦ä¸ä¸ªç»´åº¦ï¼ç±äºå¨å¤ä¸ªèç¹ä¸å卿°æ®å¯æ¬ï¼å¹¶ä¸å¨ä¸åèç¹ä¸çæ°æ®å¯è½è¢«å¹¶åå°ä¿®æ¹ï¼å æ¤éè¦éåä¸äºé¢å¤çæ¥éª¤æ¥é²æ¢ä¸¢å¤±æ´æ°ã éå CAS æä½åå®åªæä¸ä¸ªææ°çæ°æ®å¯æ¬ã使¯å¤ä¸»ææ 主å¤å¶çæ°æ®åºé常å 许å¤ä¸ªåå ¥å¹¶åæ§è¡ï¼å¹¶å¼æ¥å¤å¶å°å¯æ¬ä¸ï¼å æ¤æ æ³ä¿è¯åªæä¸ä¸ªææ°æ°æ®ç坿¬ãæä»¥åºäºéæ CAS æä½çææ¯ä¸éç¨äºè¿ç§æ åµï¼æä»¬å°å¨ â[线æ§ä¸è´æ§](ch9.md#线æ§ä¸è´æ§)â 䏿´è¯¦ç»å°è®¨è®ºè¿ä¸ªé®é¢ï¼ã ç¸åï¼å¦ â[æ£æµå¹¶ååå ¥](ch5.md#æ£æµå¹¶ååå ¥)â ä¸èæè¿°ï¼è¿ç§å¤å¶æ°æ®åºä¸çä¸ç§å¸¸è§æ¹æ³æ¯å 许并ååå ¥å建å¤ä¸ªå²çªçæ¬çå¼ï¼ä¹ç§°ä¸ºå å¼ï¼ï¼å¹¶ä½¿ç¨åºç¨ä»£ç æç¹æ®æ°æ®ç»æå¨äºå®åçä¹åè§£å³ååå¹¶è¿äºçæ¬ã ååæä½å¯ä»¥å¨å¤å¶çä¸ä¸æä¸å¾å¥½å°å·¥ä½ï¼å°¤å ¶å½å®ä»¬å ·æå¯äº¤æ¢æ§æ¶ï¼å³ï¼å¯ä»¥å¨ä¸åç坿¬ä¸ä»¥ä¸åç顺åºåºç¨å®ä»¬ï¼ä¸ä»ç¶å¯ä»¥å¾å°ç¸åçç»æï¼ãä¾å¦ï¼éå¢è®¡æ°å¨æåéåæ·»å å ç´ æ¯å¯äº¤æ¢çæä½ãè¿æ¯ Riak 2.0 æ°æ®ç±»åèåçææ³ï¼å®å¯ä»¥é²æ¢å¤å¶å¯æ¬ä¸¢å¤±æ´æ°ãå½ä¸åç客æ·ç«¯åæ¶æ´æ°ä¸ä¸ªå¼æ¶ï¼Riak èªå¨å°æ´æ°åå¹¶å¨ä¸èµ·ï¼ä»¥å ä¸¢å¤±æ´æ°ã39ãã å¦ä¸æ¹é¢ï¼æååå ¥èå©ï¼LWWï¼çå²çªè§£å³æ¹æ³å¾å®¹æä¸¢å¤±æ´æ°ï¼å¦ â[æååå ¥èå©ï¼ä¸¢å¼å¹¶ååå ¥ï¼](ch5.md#æååå ¥èå©ï¼ä¸¢å¼å¹¶ååå ¥ï¼)â ä¸æè¿°ãä¸å¹¸çæ¯ï¼LWW æ¯è®¸å¤å¤å¶æ°æ®åºä¸çé»è®¤æ¹æ¡ã ### åå ¥åæä¸å¹»è¯» åé¢çç« èä¸ï¼æä»¬çå°äº **èå** å **ä¸¢å¤±æ´æ°**ï¼å½ä¸åçäºå¡å¹¶åå°å°è¯åå ¥ç¸åç对象æ¶ï¼ä¼åºç°è¿ä¸¤ç§ç«äºæ¡ä»¶ã为äºé¿å æ°æ®æåï¼è¿äºç«äºæ¡ä»¶éè¦è¢«é»æ¢ ââ æ¢å¯ä»¥ç±æ°æ®åºèªå¨æ§è¡ï¼ä¹å¯ä»¥éè¿éååååæä½è¿ç±»æå¨å®å ¨æªæ½æ¥é²æ¢ã 使¯ï¼å¹¶ååå ¥é´å¯è½åççç«äºæ¡ä»¶è¿æ²¡æå®ã卿¬èä¸ï¼æä»¬å°çå°ä¸äºæ´å¾®å¦çå²çªä¾åã é¦å ï¼æ³è±¡ä¸ä¸è¿ä¸ªä¾åï¼ä½ æ£å¨ä¸ºå»é¢åä¸ä¸ªå»çè½®ç管çç¨åºãå»é¢é常ä¼åæ¶è¦æ±å ä½å»çå¾ å½ï¼ä½åºçº¿æ¯è³å°æä¸ä½å»çå¨å¾ å½ãå»çå¯ä»¥æ¾å¼ä»ä»¬ççæ¬¡ï¼ä¾å¦ï¼å¦æä»ä»¬èªå·±çç äºï¼ï¼åªè¦è³å°æä¸ä¸ªåäºå¨è¿ä¸çä¸ç»§ç»å·¥ä½ã40,41ãã ç°å¨æ³è±¡ä¸ä¸ï¼Alice å Bob æ¯ä¸¤ä½å¼çå»çãä¸¤äººé½æå°ä¸éï¼æä»¥ä»ä»¬é½å³å®è¯·åãä¸å¹¸çæ¯ï¼ä»ä»¬æ°å¥½å¨å䏿¶é´ç¹å»æé®ä¸çã[å¾ 7-8](img/fig7-8.png) 说æäºæ¥ä¸æ¥çäºæ ã  **å¾ 7-8 åå ¥å差导è´åºç¨ç¨åºé误ç示ä¾** å¨ä¸¤ä¸ªäºå¡ä¸ï¼åºç¨é¦å æ£æ¥æ¯å¦æä¸¤ä¸ªæä»¥ä¸çå»çæ£å¨å¼çï¼å¦ææ¯çè¯ï¼å®å°±åå®ä¸åå»çå¯ä»¥å®å ¨å°ä¼çãç±äºæ°æ®åºä½¿ç¨å¿«ç §é离ï¼ä¸¤æ¬¡æ£æ¥é½è¿å 2 ï¼æä»¥ä¸¤ä¸ªäºå¡é½è¿å ¥ä¸ä¸ä¸ªé¶æ®µãAlice æ´æ°èªå·±çè®°å½ä¼çäºï¼è Bob ä¹åäºä¸æ ·çäºæ ã两个äºå¡é½æåæäº¤äºï¼ç°å¨æ²¡æå»çå¼çäºãè¿åäºè³å°æä¸åå»çå¨å¼ççè¦æ±ã #### ååå·®çç¹å¾ è¿ç§å¼å¸¸ç§°ä¸º **ååå·®**ã28ãã宿¢ä¸æ¯ **èå**ï¼ä¹ä¸æ¯ **ä¸¢å¤±æ´æ°**ï¼å 为è¿ä¸¤ä¸ªäºå¡æ£å¨æ´æ°ä¸¤ä¸ªä¸åç对象ï¼Alice å Bob åèªçå¾ å½è®°å½ï¼ãå¨è¿éåççå²çªå¹¶ä¸æ¯é£ä¹ææ¾ï¼ä½æ¯è¿æ¾ç¶æ¯ä¸ä¸ªç«äºæ¡ä»¶ï¼å¦æä¸¤ä¸ªäºå¡ä¸ä¸ªæ¥ä¸ä¸ªå°è¿è¡ï¼é£ä¹ç¬¬äºä¸ªå»çå°±ä¸è½æçäºãå¼å¸¸è¡ä¸ºåªæå¨äºå¡å¹¶åè¿è¡æ¶ææå¯è½ã å¯ä»¥å°åå ¥åå·®è§ä¸ºä¸¢å¤±æ´æ°é®é¢çä¸è¬åãå¦æä¸¤ä¸ªäºå¡è¯»åç¸åç对象ï¼ç¶åæ´æ°å ¶ä¸ä¸äºå¯¹è±¡ï¼ä¸åçäºå¡å¯è½æ´æ°ä¸åç对象ï¼ï¼åå¯è½åçåå ¥åå·®ãå¨å¤ä¸ªäºå¡æ´æ°åä¸ä¸ªå¯¹è±¡çç¹æ®æ åµä¸ï¼å°±ä¼åçèåæä¸¢å¤±æ´æ°ï¼åå³äºæ¶åºï¼ã æä»¬å·²ç»çå°ï¼æåç§ä¸åçæ¹æ³æ¥é²æ¢ä¸¢å¤±çæ´æ°ãä½å¯¹äºååå·®ï¼æä»¬çéæ©æ´åéå¶ï¼ * ç±äºæ¶åå¤ä¸ªå¯¹è±¡ï¼å对象çååæä½ä¸èµ·ä½ç¨ã * ä¸å¹¸çæ¯ï¼å¨ä¸äºå¿«ç §é离çå®ç°ä¸ï¼èªå¨æ£æµä¸¢å¤±æ´æ°å¯¹æ¤å¹¶æ²¡æå¸®å©ãå¨ PostgreSQL çå¯éå¤è¯»ï¼MySQL/InnoDB çå¯éå¤è¯»ï¼Oracle å¯ä¸²è¡åæ SQL Server çå¿«ç §é离级å«ä¸ï¼é½ä¸ä¼èªå¨æ£æµåå ¥åå·®ã23ããèªå¨é²æ¢åå ¥åå·®éè¦çæ£çå¯ä¸²è¡åé离ï¼è¯·åé â[å¯ä¸²è¡å](#å¯ä¸²è¡å)âï¼ã * æäºæ°æ®åºå 许é 置约æï¼ç¶åç±æ°æ®åºå¼ºå¶æ§è¡ï¼ä¾å¦ï¼å¯ä¸æ§ï¼å¤é®çº¦ææç¹å®å¼éå¶ï¼ã使¯ä¸ºäºæå®è³å°æä¸åå»çå¿ é¡»å¨çº¿ï¼éè¦ä¸ä¸ªæ¶åå¤ä¸ªå¯¹è±¡ç约æã大夿°æ°æ®åºæ²¡æå 置对è¿ç§çº¦æçæ¯æï¼ä½æ¯ä½ å¯ä»¥ä½¿ç¨è§¦åå¨ï¼æè ç©åè§å¾æ¥å®ç°å®ä»¬ï¼è¿åå³äºä¸åçæ°æ®åºã42ãã * å¦ææ æ³ä½¿ç¨å¯ä¸²è¡åçé离级å«ï¼åæ¤æ åµä¸ç次ä¼é项å¯è½æ¯æ¾å¼éå®äºå¡æä¾èµçè¡ãå¨ä¾åä¸ï¼ä½ å¯ä»¥åä¸å¦ä¸ç代ç ï¼ ```sql BEGIN TRANSACTION; SELECT * FROM doctors WHERE on_call = TRUE AND shift_id = 1234 FOR UPDATE; UPDATE doctors SET on_call = FALSE WHERE name = 'Alice' AND shift_id = 1234; COMMIT; ``` * å以å䏿 ·ï¼`FOR UPDATE` åè¯æ°æ®åºéå®è¿åçææè¡ä»¥ç¨äºæ´æ°ã #### ååå·®çæ´å¤ä¾å ååå·®ä¹ç忝ä¸ä¸ªæ·±å¥¥çé®é¢ï¼ä½ä¸æ¦æè¯å°è¿ä¸ç¹ï¼å¾å®¹æä¼æ³¨æå°æ´å¤å¯è½çæ åµã以䏿¯ä¸äºä¾åï¼ * ä¼è®®å®¤é¢è®¢ç³»ç» æ¯å¦ä½ æ³è¦è§å®ä¸è½å¨å䏿¶é´å¯¹åä¸ä¸ªä¼è®®å®¤è¿è¡å¤æ¬¡çé¢è®¢ã43ããå½æäººæ³è¦é¢è®¢æ¶ï¼é¦å æ£æ¥æ¯å¦åå¨ç¸äºå²çªçé¢è®¢ï¼å³é¢è®¢æ¶é´èå´éå çå䏿¿é´ï¼ï¼å¦ææ²¡ææ¾å°ï¼åå建ä¼è®®ï¼è¯·åé ç¤ºä¾ 7-2ï¼[^ix]ã [^ix]: å¨ PostgreSQL ä¸ï¼ä½ å¯ä»¥ä½¿ç¨èå´ç±»åä¼é å°æ§è¡æ¤æä½ï¼ä½å¨å ¶ä»æ°æ®åºä¸å¹¶æªå¾å°å¹¿æ³æ¯æã **ä¾ 7-2 ä¼è®®å®¤é¢è®¢ç³»ç»è¯å¾é¿å éå¤é¢è®¢ï¼å¨å¿«ç §é离ä¸ä¸å®å ¨ï¼** ```sql BEGIN TRANSACTION; -- æ£æ¥ææç°åçä¸ 12:00~13:00 éå çé¢å® SELECT COUNT(*) FROM bookings WHERE room_id = 123 AND end_time > '2015-01-01 12:00' AND start_time < '2015-01-01 13:00'; -- 妿ä¹åçæ¥è¯¢è¿å 0 INSERT INTO bookings(room_id, start_time, end_time, user_id) VALUES (123, '2015-01-01 12:00', '2015-01-01 13:00', 666); COMMIT; ``` ä¸å¹¸çæ¯ï¼å¿«ç §é离并ä¸è½é²æ¢å¦ä¸ä¸ªç¨æ·åæ¶æå ¥å²çªçä¼è®®ã为äºç¡®ä¿ä¸ä¼éå°è°åº¦å²çªï¼ä½ åéè¦å¯ä¸²è¡åçé离级å«äºã * å¤äººæ¸¸æ å¨ [ä¾ 7-1]() ä¸ï¼æä»¬ä½¿ç¨ä¸ä¸ªéæ¥é²æ¢ä¸¢å¤±æ´æ°ï¼ä¹å°±æ¯ç¡®ä¿ä¸¤ä¸ªç©å®¶ä¸è½åæ¶ç§»å¨åä¸ä¸ªæ£åï¼ã使¯éå®å¹¶ä¸å¦¨ç¢ç©å®¶å°ä¸¤ä¸ªä¸åçæ£åç§»å¨å°æ£çä¸çç¸åä½ç½®ï¼æè éåå ¶ä»è¿å游æè§åçè¡ä¸ºãæç §ä½ æ£å¨æ§è¡çè§åç±»åï¼ä¹è®¸å¯ä»¥ä½¿ç¨å¯ä¸çº¦æï¼unique constraintï¼ï¼å¦åä½ å¾å®¹æåçåå ¥åå·®ã * æ¢æ³¨ç¨æ·å 卿¯ä¸ªç¨æ·æ¥æå¯ä¸ç¨æ·åçç½ç«ä¸ï¼ä¸¤ä¸ªç¨æ·å¯è½ä¼å°è¯åæ¶åå»ºå ·æç¸åç¨æ·åç叿·ãå¯ä»¥å¨äºå¡æ£æ¥åç§°æ¯å¦è¢«æ¢å ï¼å¦ææ²¡æå使ç¨è¯¥åç§°å建账æ·ã使¯åå¨åé¢çä¾åä¸é£æ ·ï¼å¨å¿«ç §é离ä¸è¿æ¯ä¸å®å ¨çã幸è¿çæ¯ï¼å¯ä¸çº¦ææ¯ä¸ä¸ªç®åçè§£å³åæ³ï¼ç¬¬äºä¸ªäºå¡å¨æäº¤æ¶ä¼å 为è¿åç¨æ·åå¯ä¸çº¦æèè¢«ä¸æ¢ï¼ã * 鲿¢åé弿¯ å è®¸ç¨æ·è±é±æç§¯åçæå¡ï¼éè¦æ£æ¥ç¨æ·çæ¯ä»æ°é¢ä¸è¶ è¿å ¶ä½é¢ãå¯ä»¥éè¿å¨ç¨æ·ç叿·ä¸æå ¥ä¸ä¸ªè¯æ¢æ§çæ¶è´¹é¡¹ç®æ¥å®ç°è¿ä¸ç¹ï¼ååºå¸æ·ä¸çææé¡¹ç®ï¼å¹¶æ£æ¥æ»åæ¯å¦ä¸ºæ£å¼ã44ããæäºåå ¥åå·®ï¼å¯è½ä¼åç两个æ¯åºé¡¹ç®åæ¶æå ¥ï¼ä¸èµ·å¯¼è´ä½é¢å为è´å¼ï¼ä½è¿ä¸¤ä¸ªäºå¡é½ä¸ä¼æ³¨æå°å¦ä¸ä¸ªã #### 导è´åå ¥åå·®ç幻读 ææè¿äºä¾åé½éµå¾ªç±»ä¼¼ç模å¼ï¼ 1. ä¸ä¸ª `SELECT` æ¥è¯¢æ¾åºç¬¦åæ¡ä»¶çè¡ï¼å¹¶æ£æ¥æ¯å¦ç¬¦åä¸äºè¦æ±ãï¼ä¾å¦ï¼è³å°æä¸¤åå»çå¨å¼çï¼ä¸åå¨å¯¹è¯¥ä¼è®®å®¤å䏿¶æ®µçé¢å®ï¼æ£çä¸çä½ç½®æ²¡æè¢«å ¶ä»æ£åå æ®ï¼ç¨æ·åè¿æ²¡æè¢«æ¢æ³¨ï¼è´¦æ·éè¿æè¶³å¤ä½é¢ï¼ 2. æç §ç¬¬ä¸ä¸ªæ¥è¯¢çç»æï¼åºç¨ä»£ç å³å®æ¯å¦ç»§ç»ãï¼å¯è½ä¼ç»§ç»æä½ï¼ä¹å¯è½ä¸æ¢å¹¶æ¥éï¼ 3. 妿åºç¨å³å®ç»§ç»æä½ï¼å°±æ§è¡åå ¥ï¼æå ¥ãæ´æ°æå é¤ï¼ï¼å¹¶æäº¤äºå¡ã è¿ä¸ªåå ¥çæææ¹åäºæ¥éª¤ 2 ä¸çå 峿¡ä»¶ãæ¢å¥è¯è¯´ï¼å¦æå¨æäº¤åå ¥åï¼é夿§è¡ä¸æ¬¡æ¥éª¤ 1 ç SELECT æ¥è¯¢ï¼å°ä¼å¾å°ä¸åçç»æãå 为åå ¥æ¹åäºç¬¦åæç´¢æ¡ä»¶çè¡éï¼ç°å¨å°äºä¸ä¸ªå»çå¼çï¼é£æ¶åçä¼è®®å®¤ç°å¨å·²ç»è¢«é¢è®¢äºï¼æ£çä¸çè¿ä¸ªä½ç½®å·²ç»è¢«å æ®äºï¼ç¨æ·åå·²ç»è¢«æ¢æ³¨ï¼è´¦æ·ä½é¢ä¸å¤äºï¼ã è¿äºæ¥éª¤å¯è½ä»¥ä¸åç顺åºåçãä¾å¦å¯ä»¥é¦å è¿è¡åå ¥ï¼ç¶åè¿è¡ SELECT æ¥è¯¢ï¼æåæ ¹æ®æ¥è¯¢ç»æå³å®æ¯æ¾å¼è¿æ¯æäº¤ã å¨å»çå¼ççä¾åä¸ï¼å¨æ¥éª¤ 3 ä¸ä¿®æ¹çè¡ï¼æ¯æ¥éª¤ 1 ä¸è¿åçè¡ä¹ä¸ï¼æä»¥æä»¬å¯ä»¥éè¿é宿¥éª¤ 1 ä¸çè¡ï¼`SELECT FOR UPDATE`ï¼æ¥ä½¿äºå¡å®å ¨å¹¶é¿å åå ¥åå·®ã使¯å ¶ä»å个ä¾åæ¯ä¸åçï¼å®ä»¬æ£æ¥æ¯å¦ **ä¸åå¨** æäºæ»¡è¶³æ¡ä»¶çè¡ï¼åå ¥ä¼ **æ·»å ** ä¸ä¸ªå¹é ç¸åæ¡ä»¶çè¡ã妿æ¥éª¤ 1 ä¸çæ¥è¯¢æ²¡æè¿åä»»ä½è¡ï¼å `SELECT FOR UPDATE` éä¸äºä»»ä½ä¸è¥¿ã è¿ç§æåºï¼ä¸ä¸ªäºå¡ä¸çåå ¥æ¹åå¦ä¸ä¸ªäºå¡çæç´¢æ¥è¯¢çç»æï¼è¢«ç§°ä¸º **幻读**ã3ããå¿«ç §é离é¿å äºåªè¯»æ¥è¯¢ä¸å¹»è¯»ï¼ä½æ¯å¨åæä»¬è®¨è®ºçä¾å飿 ·ç读åäºå¡ä¸ï¼å¹»è¯»ä¼å¯¼è´ç¹å«æ£æçåå ¥åå·®æ åµã #### ç©åå²çª å¦æå¹»è¯»çé®é¢æ¯æ²¡æå¯¹è±¡å¯ä»¥å éï¼ä¹è®¸å¯ä»¥äººä¸ºå°å¨æ°æ®åºä¸å¼å ¥ä¸ä¸ªéå¯¹è±¡ï¼ ä¾å¦ï¼å¨ä¼è®®å®¤é¢è®¢çåºæ¯ä¸ï¼å¯ä»¥æ³è±¡å建ä¸ä¸ªå ³äºæ¶é´æ§½åæ¿é´çè¡¨ãæ¤è¡¨ä¸çæ¯ä¸è¡å¯¹åºäºç¹å®æ¶é´æ®µï¼ä¾å¦ 15 åéï¼çç¹å®æ¿é´ãå¯ä»¥æåæå ¥æ¿é´åæ¶é´çææå¯è½ç»åè¡ï¼ä¾å¦æ¥ä¸æ¥çå 个æï¼ã ç°å¨ï¼è¦å建é¢è®¢çäºå¡å¯ä»¥éå®ï¼`SELECT FOR UPDATE`ï¼è¡¨ä¸ä¸æéæ¿é´åæ¶é´æ®µå¯¹åºçè¡ãå¨è·å¾éå®ä¹åï¼å®å¯ä»¥æ£æ¥éå çé¢è®¢å¹¶å以å䏿 ·æå ¥æ°çé¢è®¢ã请注æï¼è¿ä¸ªè¡¨å¹¶ä¸æ¯ç¨æ¥åå¨é¢è®¢ç¸å ³çä¿¡æ¯ ââ å®å®å ¨å°±æ¯ä¸ç»éï¼ç¨äºé²æ¢åæ¶ä¿®æ¹å䏿¿é´åæ¶é´èå´å çé¢è®¢ã è¿ç§æ¹æ³è¢«ç§°ä¸º **ç©åå²çªï¼materializing conflictsï¼**ï¼å 为å®å°å¹»è¯»åä¸ºæ°æ®åºä¸ä¸ç»å ·ä½è¡ä¸çéå²çªã11ããä¸å¹¸çæ¯ï¼å¼æ¸ æ¥å¦ä½ç©åå²çªå¯è½å¾é¾ï¼ä¹å¾å®¹æåºéï¼èè®©å¹¶åæ§å¶æºå¶æ³æ¼å°åºç¨æ°æ®æ¨¡åæ¯å¾ä¸éçåæ³ãåºäºè¿äºåå ï¼å¦ææ²¡æå ¶ä»åæ³å¯ä»¥å®ç°ï¼ç©åå²çªåºè¢«è§ä¸ºæåçææ®µãå¨å¤§å¤æ°æ åµä¸ã**å¯ä¸²è¡åï¼Serializableï¼** çéç¦»çº§å«æ¯æ´å¯åçã ## å¯ä¸²è¡å 卿¬ç« ä¸ï¼å·²ç»çå°äºå 个æäºåºç°ç«äºæ¡ä»¶çäºå¡ä¾åã**读已æäº¤** å **å¿«ç §é离** 级å«ä¼é»æ¢æäºç«äºæ¡ä»¶ï¼ä½ä¸ä¼é»æ¢å¦ä¸äºãæä»¬éå°äºä¸äºç¹å«æ£æçä¾åï¼**åå ¥åå·®** å **幻读**ãè¿æ¯ä¸ä¸ªå¯æ²çæ åµï¼ - é离级å«é¾ä»¥çè§£ï¼å¹¶ä¸å¨ä¸åçæ°æ®åºä¸å®ç°çä¸ä¸è´ï¼ä¾å¦ï¼âå¯éå¤è¯»â çå«ä¹å¤©å·®å°å«ï¼ã - å æ£æ¥åºç¨ä»£ç å¾é¾å¤æå¨ç¹å®çé离级å«è¿è¡æ¯å¦å®å ¨ã ç¹å«æ¯å¨å¤§ååºç¨ç¨åºä¸ï¼ä½ å¯è½å¹¶ä¸ç¥éå¹¶ååççææäºæ ã - æ²¡ææ£æµç«äºæ¡ä»¶çå¥½å·¥å ·ãåå䏿¥è¯´ï¼éæåæå¯è½ä¼æå¸®å©ã26ãï¼ä½ç ç©¶ä¸çææ¯è¿æ²¡æ³å®é åºç¨ãå¹¶åé®é¢çæµè¯æ¯å¾é¾çï¼å 为å®ä»¬é常æ¯éç¡®å®æ§ç ââ åªæå¨åéçæ¶åºä¸æä¼åºç°é®é¢ã è¿ä¸æ¯ä¸ä¸ªæ°é®é¢ï¼ä» 20 ä¸çºª 70 年代以æ¥å°±ä¸ç´æ¯è¿æ ·äºï¼å½æ¶é¦å å¼å ¥äºè¾å¼±çé离级å«ã2ããä¸ç´ä»¥æ¥ï¼ç 究人åççæ¡é½å¾ç®åï¼ä½¿ç¨ **å¯ä¸²è¡åï¼serializableï¼** çé离级å«ï¼ **å¯ä¸²è¡åï¼Serializabilityï¼** é离éå¸¸è¢«è®¤ä¸ºæ¯æå¼ºçé离级å«ãå®ä¿è¯å³ä½¿äºå¡å¯ä»¥å¹¶è¡æ§è¡ï¼æç»çç»æä¹æ¯ä¸æ ·çï¼å°±å¥½åå®ä»¬æ²¡æä»»ä½å¹¶åæ§ï¼è¿ç»æ¨ä¸ªæ§è¡ä¸æ ·ãå æ¤æ°æ®åºä¿è¯ï¼å¦æäºå¡å¨åç¬è¿è¡æ¶æ£å¸¸è¿è¡ï¼åå®ä»¬å¨å¹¶åè¿è¡æ¶ç»§ç»ä¿ææ£ç¡® ââ æ¢å¥è¯è¯´ï¼æ°æ®åºå¯ä»¥é²æ¢ **ææ** å¯è½çç«äºæ¡ä»¶ã ä½å¦æå¯ä¸²è¡åéç¦»çº§å«æ¯å¼±é离级å«ççæåè¦å¥½å¾å¤ï¼é£ä¸ºä»ä¹æ²¡æäººè§äººç±ï¼ä¸ºäºåçè¿ä¸ªé®é¢ï¼æä»¬éè¦ççå®ç°å¯ä¸²è¡åçé项ï¼ä»¥åå®ä»¬å¦ä½æ§è¡ãç®å大夿°æä¾å¯ä¸²è¡åçæ°æ®åºé½ä½¿ç¨äºä¸ç§ææ¯ä¹ä¸ï¼æ¬ç« çå©ä½é¨åå°ä¼ä»ç»è¿äºææ¯ï¼ - å颿ä¹ä¸å°ä¸²è¡é¡ºåºæ§è¡äºå¡ï¼è¯·åé â[ççä¸²è¡æ§è¡](#ççä¸²è¡æ§è¡)âï¼ - **䏤鶿®µéå®ï¼2PL, two-phase lockingï¼**ï¼å åå¹´æ¥å¯ä¸å¯è¡çéæ©ï¼è¯·åé â[䏤鶿®µéå®](#䏤鶿®µéå®)âï¼ - ä¹è§å¹¶åæ§å¶ææ¯ï¼ä¾å¦ **å¯ä¸²è¡åå¿«ç §é离**ï¼serializable snapshot isolationï¼è¯·åé â[å¯ä¸²è¡åå¿«ç §é离](#å¯ä¸²è¡åå¿«ç §é离)âï¼ ç°å¨å°ä¸»è¦å¨åèç¹æ°æ®åºçèæ¯ä¸è®¨è®ºè¿äºææ¯ï¼å¨ [第ä¹ç« ](ch9.md) ä¸ï¼æä»¬å°ç ç©¶å¦ä½å°å®ä»¬æ¨å¹¿å°æ¶ååå¸å¼ç³»ç»ä¸å¤ä¸ªèç¹çäºå¡ã ### ççä¸²è¡æ§è¡ é¿å å¹¶åé®é¢çæç®åæ¹æ³å°±æ¯å®å ¨ä¸è¦å¹¶åï¼å¨å个线ç¨ä¸æé¡ºåºä¸æ¬¡åªæ§è¡ä¸ä¸ªäºå¡ãè¿æ ·åå°±å®å ¨ç»å¼äºæ£æµ / 鲿¢äºå¡é´å²çªçé®é¢ï¼ç±æ¤äº§ççéç¦»ï¼æ£æ¯å¯ä¸²è¡åçå®ä¹ã 尽管è¿ä¼¼ä¹æ¯ä¸ä¸ªææ¾ç主æï¼ä½æ°æ®åºè®¾è®¡äººååªæ¯å¨ 2007 年左峿å³å®ï¼å线ç¨å¾ªç¯æ§è¡äºå¡æ¯å¯è¡çã45ãã妿å¤çº¿ç¨å¹¶åå¨è¿å»ç 30 å¹´ä¸è¢«è®¤ä¸ºæ¯è·å¾è¯å¥½æ§è½çå ³é®æå¨ï¼é£ä¹ç©¶ç«æ¯ä»ä¹æ¹åè´ä½¿åçº¿ç¨æ§è¡å为å¯è½å¢ï¼ 两个è¿å±å¼åäºè¿ä¸ªåæï¼ - RAM è¶³å¤ä¾¿å®äºï¼è®¸å¤åºæ¯ç°å¨é½å¯ä»¥å°å®æ´çæ´»è·æ°æ®éä¿åå¨å åä¸ãï¼è¯·åé â[å¨å åä¸åå¨ä¸å](ch3.md#å¨å åä¸åå¨ä¸å)âï¼ãå½äºå¡éè¦è®¿é®çæææ°æ®é½å¨å å䏿¶ï¼äºå¡å¤ççæ§è¡éåº¦è¦æ¯çå¾ æ°æ®ä»ç£çå è½½æ¶å¿«å¾å¤ã - æ°æ®åºè®¾è®¡äººåæè¯å° OLTP äºå¡é常å¾çï¼èä¸åªè¿è¡å°éç读åæä½ï¼è¯·åé â[äºå¡å¤çè¿æ¯åæï¼](ch3.md#äºå¡å¤çè¿æ¯åæï¼)âï¼ãç¸æ¯ä¹ä¸ï¼é¿æ¶é´è¿è¡çåææ¥è¯¢é常æ¯åªè¯»çï¼å æ¤å®ä»¬å¯ä»¥å¨ä¸²è¡æ§è¡å¾ªç¯ä¹å¤çä¸è´å¿«ç §ï¼ä½¿ç¨å¿«ç §é离ï¼ä¸è¿è¡ã ä¸²è¡æ§è¡äºå¡çæ¹æ³å¨ VoltDB/H-Storeï¼Redis å Datomic ä¸å®ç°ã46,47,48ãã设计ç¨äºåçº¿ç¨æ§è¡çç³»ç»ææ¶å¯ä»¥æ¯æ¯æå¹¶åçç³»ç»æ´å¥½ï¼å 为å®å¯ä»¥é¿å éçåè°å¼éã使¯å ¶ååéä» éäºå个 CPU æ ¸çååéã为äºå åå©ç¨åä¸çº¿ç¨ï¼éè¦ä¸ä¼ ç»å½¢å¼çäºå¡ä¸åçç»æã #### å¨åå¨è¿ç¨ä¸å°è£ äºå¡ 卿°æ®åºçæ©æé¶æ®µï¼æå¾æ¯æ°æ®åºäºå¡å¯ä»¥å 嫿´ä¸ªç¨æ·æ´»å¨æµç¨ãä¾å¦ï¼é¢è®¢æºç¥¨æ¯ä¸ä¸ªå¤é¶æ®µçè¿ç¨ï¼æç´¢è·¯çº¿ï¼ç¥¨ä»·åå¯ç¨åº§ä½ï¼å³å®è¡ç¨ï¼å¨æ¯æ®µè¡ç¨çèªçä¸è®¢åº§ï¼è¾å ¥ä¹å®¢ä¿¡æ¯ï¼ä»æ¬¾ï¼ãæ°æ®åºè®¾è®¡è 认为ï¼å¦ææ´ä¸ªè¿ç¨æ¯ä¸ä¸ªäºå¡ï¼é£ä¹å®å°±å¯ä»¥è¢«åååå°æ§è¡ã ä¸å¹¸çæ¯ï¼äººç±»ååºå³å®åååºçé度éå¸¸ç¼æ ¢ãå¦ææ°æ®åºäºå¡éè¦çå¾ æ¥èªç¨æ·çè¾å ¥ï¼åæ°æ®åºéè¦æ¯ææ½å¨ç大éå¹¶åäºå¡ï¼å ¶ä¸å¤§é¨åæ¯ç©ºé²çã大夿°æ°æ®åºä¸è½é«æå®æè¿é¡¹å·¥ä½ï¼å æ¤å 乿æç OLTP åºç¨ç¨åºé½é¿å å¨äºå¡ä¸çå¾ äº¤äºå¼çç¨æ·è¾å ¥ï¼ä»¥æ¤æ¥ä¿æäºå¡çç®çãå¨ Web ä¸ï¼è¿æå³çäºå¡å¨åä¸ä¸ª HTTP 请æ±ä¸è¢«æäº¤ ââ ä¸ä¸ªäºå¡ä¸ä¼è·¨è¶å¤ä¸ªè¯·æ±ãä¸ä¸ªæ°ç HTTP 请æ±å¼å§ä¸ä¸ªæ°çäºå¡ã å³ä½¿å·²ç»å°äººç±»ä»å ³é®è·¯å¾ä¸æé¤ï¼äºå¡ä»ç¶ä»¥äº¤äºå¼ç客æ·ç«¯ / æå¡å¨é£æ ¼æ§è¡ï¼ä¸æ¬¡ä¸ä¸ªè¯å¥ãåºç¨ç¨åºè¿è¡æ¥è¯¢ï¼è¯»åç»æï¼å¯è½æ ¹æ®ç¬¬ä¸ä¸ªæ¥è¯¢çç»æè¿è¡å¦ä¸ä¸ªæ¥è¯¢ï¼ä¾æ¤ç±»æ¨ãæ¥è¯¢åç»æå¨åºç¨ç¨åºä»£ç ï¼å¨ä¸å°æºå¨ä¸è¿è¡ï¼åæ°æ®åºæå¡å¨ï¼å¨å¦ä¸å°æºå¨ä¸ï¼ä¹é´æ¥ååéã å¨è¿ç§äº¤äºå¼çäºå¡æ¹å¼ä¸ï¼åºç¨ç¨åºåæ°æ®åºä¹é´çç½ç»éä¿¡èè´¹äºå¤§éçæ¶é´ã妿ä¸å è®¸å¨æ°æ®åºä¸è¿è¡å¹¶åå¤çï¼ä¸ä¸æ¬¡åªå¤çä¸ä¸ªäºå¡ï¼åååéå°ä¼é常ç³ç³ï¼å ä¸ºæ°æ®åºå¤§é¨åçæ¶é´é½è±è´¹å¨çå¾ åºç¨ç¨åºååºå½åäºå¡çä¸ä¸ä¸ªæ¥è¯¢ãå¨è¿ç§æ°æ®åºä¸ï¼ä¸ºäºè·å¾åççæ§è½ï¼éè¦åæ¶å¤çå¤ä¸ªäºå¡ã åºäºè¿ä¸ªåå ï¼å ·æå线ç¨ä¸²è¡äºå¡å¤ççç³»ç»ä¸å 许交äºå¼çå¤è¯å¥äºå¡ãåè代ä¹ï¼åºç¨ç¨åºå¿ é¡»æåå°æ´ä¸ªäºå¡ä»£ç ä½ä¸ºåå¨è¿ç¨æäº¤ç»æ°æ®åºãè¿äºæ¹æ³ä¹é´çå·®å¼å¦ [å¾ 7-9](img/fig7-9.png) æç¤ºã妿äºå¡æéçæææ°æ®é½å¨å åä¸ï¼ååå¨è¿ç¨å¯ä»¥éå¸¸å¿«å°æ§è¡ï¼èä¸ç¨çå¾ ä»»ä½ç½ç»æç£ç I/Oã  **å¾ 7-9 交äºå¼äºå¡ååå¨è¿ç¨ä¹é´çåºå«ï¼ä½¿ç¨å¾ 7-8 ç示ä¾äºå¡ï¼** #### åå¨è¿ç¨çä¼ç¹åç¼ºç¹ åå¨è¿ç¨å¨å ³ç³»åæ°æ®åºä¸å·²ç»åå¨äºä¸æ®µæ¶é´äºï¼èª 1999 年以æ¥å®ä»¬ä¸ç´æ¯ SQL æ åï¼SQL/PSMï¼çä¸é¨åãåºäºåç§åå ï¼å®ä»¬çå声æç¹ä¸å¤ªå¥½ï¼ - æ¯ä¸ªæ°æ®åºåå齿èªå·±çåå¨è¿ç¨è¯è¨ï¼Oracle æ PL/SQLï¼SQL Server æ T-SQLï¼PostgreSQL æ PL/pgSQL çï¼ãè¿äºè¯è¨å¹¶æ²¡æè·ä¸éç¨ç¼ç¨è¯è¨çåå±ï¼æä»¥ä»ä»å¤©çè§åº¦æ¥çï¼å®ä»¬çèµ·æ¥ç¸å½ä¸éåéæ§ï¼èä¸ç¼ºä¹å¤§å¤æ°ç¼ç¨è¯è¨ä¸è½æ¾å°çåºççæç³»ç»ã - 卿°æ®åºä¸è¿è¡ç代ç é¾ä»¥ç®¡çï¼ä¸åºç¨æå¡å¨ç¸æ¯ï¼å®æ´é¾è°è¯ï¼æ´é¾ä»¥ä¿æçæ¬æ§å¶åé¨ç½²ï¼æ´é¾æµè¯ï¼å¹¶ä¸é¾ä»¥éæå°ææ æ¶éç³»ç»æ¥è¿è¡çæ§ã - æ°æ®åºé常æ¯åºç¨æå¡å¨å¯¹æ§è½ææçå¤ï¼å 为åä¸ªæ°æ®åºå®ä¾é常ç±è®¸å¤åºç¨æå¡å¨å ±äº«ãæ°æ®åºä¸ä¸ä¸ªåå¾ä¸å¥½çåå¨è¿ç¨ï¼ä¾å¦ï¼å ç¨å¤§éå åæ CPU æ¶é´ï¼ä¼æ¯å¨åºç¨æå¡å¨ä¸ç¸åç代ç é ææ´å¤ç麻ç¦ã 使¯è¿äºé®é¢é½æ¯å¯ä»¥å æçãç°ä»£çåå¨è¿ç¨å®ç°æ¾å¼äº PL/SQLï¼èæ¯ä½¿ç¨ç°æçéç¨ç¼ç¨è¯è¨ï¼VoltDB ä½¿ç¨ Java æ Groovyï¼Datomic ä½¿ç¨ Java æ Clojureï¼è Redis ä½¿ç¨ Luaã **åå¨è¿ç¨ä¸å ååå¨**ï¼ä½¿å¾å¨å个线ç¨ä¸æ§è¡ææäºå¡åå¾å¯è¡ãç±äºä¸éè¦çå¾ I/Oï¼ä¸é¿å äºå¹¶åæ§å¶æºå¶çå¼éï¼å®ä»¬å¯ä»¥å¨å个线ç¨ä¸å®ç°ç¸å½å¥½çååéã VoltDB è¿ä½¿ç¨åå¨è¿ç¨è¿è¡å¤å¶ï¼ä½ä¸æ¯å°äºå¡çåå ¥ç»æä»ä¸ä¸ªèç¹å¤å¶å°å¦ä¸ä¸ªèç¹ï¼èæ¯å¨æ¯ä¸ªèç¹ä¸æ§è¡ç¸åçåå¨è¿ç¨ãå æ¤ VoltDB è¦æ±åå¨è¿ç¨æ¯ **ç¡®å®æ§ç**ï¼å¨ä¸åçèç¹ä¸è¿è¡æ¶ï¼å®ä»¬å¿ 须产çç¸åçç»æï¼ã举个ä¾åï¼å¦æäºå¡éè¦ä½¿ç¨å½åçæ¥æåæ¶é´ï¼åå¿ é¡»éè¿ç¹æ®çç¡®å®æ§ API æ¥å®ç°ã #### ååº é¡ºåºæ§è¡ææäºå¡ä½¿å¹¶åæ§å¶ç®åå¤äºï¼ä½æ°æ®åºçäºå¡ååé被éå¶ä¸ºåæºåæ ¸çé度ãåªè¯»äºå¡å¯ä»¥ä½¿ç¨å¿«ç §é离å¨å ¶å®å°æ¹æ§è¡ï¼ä½å¯¹äºåå ¥ååéè¾é«çåºç¨ï¼å线ç¨äºå¡å¤çå¨å¯è½æä¸ºä¸ä¸ªä¸¥éçç¶é¢ã 为äºä¼¸ç¼©è³å¤ä¸ª CPU æ ¸å¿åå¤ä¸ªèç¹ï¼å¯ä»¥å¯¹æ°æ®è¿è¡ååºï¼è¯·åé [第å ç« ](ch6.md)ï¼ï¼å¨ VoltDB 䏿¯æè¿æ ·åãå¦æä½ å¯ä»¥æ¾å°ä¸ç§å¯¹æ°æ®éè¿è¡ååºçæ¹æ³ï¼ä»¥ä¾¿æ¯ä¸ªäºå¡åªéè¦å¨å个ååºä¸è¯»åæ°æ®ï¼é£ä¹æ¯ä¸ªååºå°±å¯ä»¥æ¥æèªå·±ç¬ç«è¿è¡çäºå¡å¤ç线ç¨ãå¨è¿ç§æ åµä¸å¯ä»¥ä¸ºæ¯ä¸ªååºææ´¾ä¸ä¸ªç¬ç«ç CPU æ ¸ï¼äºå¡ååéå°±å¯ä»¥ä¸ CPU æ ¸æ°ä¿æçº¿æ§ä¼¸ç¼©ã47ãã 使¯ï¼å¯¹äºéè¦è®¿é®å¤ä¸ªååºçä»»ä½äºå¡ï¼æ°æ®åºå¿ é¡»å¨è§¦åçææååºä¹é´åè°äºå¡ãåå¨è¿ç¨éè¦è·¨è¶ææååºé宿§è¡ï¼ä»¥ç¡®ä¿æ´ä¸ªç³»ç»çå¯ä¸²è¡æ§ã ç±äºè·¨ååºäºå¡å ·æé¢å¤çåè°å¼éï¼æä»¥å®ä»¬æ¯åååºäºå¡æ ¢å¾å¤ã VoltDB æ¥åçååéå¤§çº¦æ¯æ¯ç§ 1000 个跨ååºåå ¥ï¼æ¯åååºååéä½å 个æ°é级ï¼å¹¶ä¸ä¸è½éè¿å¢å æ´å¤çæºå¨æ¥å¢å ã49ãã äºå¡æ¯å¦å¯ä»¥æ¯ååè³å个ååºå¾å¤§ç¨åº¦ä¸åå³äºåºç¨æ°æ®çç»æãç®åçé®å¼æ°æ®é常å¯ä»¥é常容æå°è¿è¡ååºï¼ä½æ¯å ·æå¤ä¸ªæ¬¡çº§ç´¢å¼çæ°æ®å¯è½éè¦å¤§éçè·¨ååºåè°ï¼è¯·åé â[ååºä¸æ¬¡çº§ç´¢å¼](ch6.md#ååºä¸æ¬¡çº§ç´¢å¼)âï¼ã #### ä¸²è¡æ§è¡å°ç» å¨ç¹å®çº¦ææ¡ä»¶ä¸ï¼ççä¸²è¡æ§è¡äºå¡ï¼å·²ç»æä¸ºä¸ç§å®ç°å¯ä¸²è¡åé离ç级çå¯è¡åæ³ã - æ¯ä¸ªäºå¡é½å¿ é¡»å°èå¿«ï¼åªè¦æä¸ä¸ªç¼æ ¢çäºå¡ï¼å°±ä¼ææ ¢ææäºå¡å¤çã - ä» éäºæ´»è·æ°æ®éå¯ä»¥æ¾å ¥å åçæ åµãå¾å°è®¿é®çæ°æ®å¯è½ä¼è¢«ç§»å¨å°ç£çï¼ä½å¦æéè¦å¨åçº¿ç¨æ§è¡çäºå¡ä¸è®¿é®ï¼ç³»ç»å°±ä¼åå¾éå¸¸æ ¢ [^x]ã - åå ¥ååéå¿ é¡»ä½å°è½å¨å个 CPU æ ¸ä¸å¤çï¼å¦è¥ä¸ç¶ï¼äºå¡éè¦è½ååè³å个ååºï¼ä¸ä¸éè¦è·¨ååºåè°ã - è·¨ååºäºå¡æ¯å¯è½çï¼ä½æ¯å®ä»¬è½è¢«ä½¿ç¨çç¨åº¦æå¾å¤§çéå¶ã [^x]: 妿äºå¡éè¦è®¿é®ä¸å¨å åä¸çæ°æ®ï¼æå¥½çè§£å³æ¹æ¡å¯è½æ¯ä¸æ¢äºå¡ï¼å¼æ¥å°å°æ°æ®æåå°å åä¸ï¼åæ¶ç»§ç»å¤çå ¶ä»äºå¡ï¼ç¶å卿°æ®å è½½å®æ¯æ¶éæ°å¯å¨äºå¡ãè¿ç§æ¹æ³è¢«ç§°ä¸º **åç¼åï¼anti-cachingï¼**ï¼æ£å¦åé¢å¨ â[å¨å åä¸åå¨ä¸å](ch3.md#å¨å åä¸åå¨ä¸å)â ä¸æè¿°ã ### 䏤鶿®µéå® å¤§çº¦ 30 å¹´æ¥ï¼å¨æ°æ®åºä¸åªæä¸ç§å¹¿æ³ä½¿ç¨ç串è¡åç®æ³ï¼**䏤鶿®µéå®ï¼2PLï¼two-phase lockingï¼** [^xi] [^xi]: ææ¶ä¹ç§°ä¸º **ä¸¥æ ¼ä¸¤é¶æ®µéå®ï¼SS2PL, strong strict two-phase lockingï¼**ï¼ä»¥ä¾¿åå ¶ä» 2PL åä½åºåã > #### 2PL䏿¯2PC > > 请注æï¼è½ç¶ä¸¤é¶æ®µéå®ï¼2PLï¼å¬èµ·æ¥é常类似äºä¸¤é¶æ®µæäº¤ï¼2PCï¼ï¼ä½å®ä»¬æ¯å®å ¨ä¸åçä¸è¥¿ãæä»¬å°å¨ [第ä¹ç« ](ch9.md) 讨论 2PCã ä¹åæä»¬çå°éé常ç¨äºé²æ¢èåï¼è¯·åé â[没æèå](#没æèå)â ä¸èï¼ï¼å¦æä¸¤ä¸ªäºå¡åæ¶å°è¯åå ¥åä¸ä¸ªå¯¹è±¡ï¼åéå¯ç¡®ä¿ç¬¬äºä¸ªåå ¥å¿ é¡»çå°ç¬¬ä¸ä¸ªåå ¥å®æäºå¡ï¼ä¸æ¢ææäº¤ï¼ï¼ç¶åæè½ç»§ç»ã 䏤鶿®µéå®ç±»ä¼¼ï¼ä½æ¯éçè¦æ±æ´å¼ºå¾å¤ãåªè¦æ²¡æåå ¥ï¼å°±å 许å¤ä¸ªäºå¡åæ¶è¯»ååä¸ä¸ªå¯¹è±¡ãä½å¯¹è±¡åªè¦æåå ¥ï¼ä¿®æ¹æå é¤ï¼ï¼å°±éè¦ **ç¬å 访é®ï¼exclusive accessï¼** æéï¼ - 妿äºå¡ A 读åäºä¸ä¸ªå¯¹è±¡ï¼å¹¶ä¸äºå¡ B æ³è¦åå ¥è¯¥å¯¹è±¡ï¼é£ä¹ B å¿ é¡»çå° A æäº¤æä¸æ¢æè½ç»§ç»ï¼è¿ç¡®ä¿ B ä¸è½å¨ A åºä¸æå¤å°æ¹å对象ï¼ã - 妿äºå¡ A åå ¥äºä¸ä¸ªå¯¹è±¡ï¼å¹¶ä¸äºå¡ B æ³è¦è¯»å该对象ï¼å B å¿ é¡»çå° A æäº¤æä¸æ¢æè½ç»§ç»ï¼å [å¾ 7-1](img/fig7-1.png) 飿 ·è¯»åæ§çæ¬çå¯¹è±¡å¨ 2PL 䏿¯ä¸å¯æ¥åçï¼ã å¨ 2PL ä¸ï¼åå ¥ä¸ä» ä¼é»å¡å ¶ä»åå ¥ï¼ä¹ä¼é»å¡è¯»ï¼åä¹äº¦ç¶ãå¿«ç §éç¦»ä½¿å¾ **读ä¸é»å¡åï¼åä¹ä¸é»å¡è¯»**ï¼è¯·åé â[å®ç°å¿«ç §é离](#å®ç°å¿«ç §é离)âï¼ï¼è¿æ¯ 2PL åå¿«ç §é离ä¹é´çå ³é®åºå«ãå¦ä¸æ¹é¢ï¼å 为 2PL æä¾äºå¯ä¸²è¡åçæ§è´¨ï¼å®å¯ä»¥é²æ¢æ©å è®¨è®ºçææç«äºæ¡ä»¶ï¼å æ¬ä¸¢å¤±æ´æ°ååå ¥åå·®ã #### å®ç°ä¸¤é¶æ®µé 2PL ç¨äº MySQLï¼InnoDBï¼å SQL Server ä¸çå¯ä¸²è¡åé离级å«ï¼ä»¥å DB2 ä¸çå¯éå¤è¯»é离级å«ã23,36ãã 读ä¸åçé»å¡æ¯éè¿ä¸ºæ°æ®åºä¸æ¯ä¸ªå¯¹è±¡æ·»å 鿥å®ç°çãéå¯ä»¥å¤äº **å ±äº«æ¨¡å¼ï¼shared modeï¼** æ **ç¬å 模å¼ï¼exclusive modeï¼**ãé使ç¨å¦ä¸ï¼ - è¥äºå¡è¦è¯»å对象ï¼åé¡»å ä»¥å ±äº«æ¨¡å¼è·åéãå 许å¤ä¸ªäºå¡åæ¶ææå ±äº«éãä½å¦æå¦ä¸ä¸ªäºå¡å·²ç»å¨å¯¹è±¡ä¸æææå®éï¼åè¿äºäºå¡å¿ é¡»çå¾ ã - è¥äºå¡è¦åå ¥ä¸ä¸ªå¯¹è±¡ï¼å®å¿ é¡»é¦å 以ç¬å 模å¼è·å该éãæ²¡æå ¶ä»äºå¡å¯ä»¥åæ¶ææéï¼æ 论æ¯å ±äº«æ¨¡å¼è¿æ¯ç¬å 模å¼ï¼ï¼æä»¥å¦æå¯¹è±¡ä¸åå¨ä»»ä½éï¼è¯¥äºå¡å¿ é¡»çå¾ ã - 妿äºå¡å 读åååå ¥å¯¹è±¡ï¼åå®å¯è½ä¼å°å ¶å ±äº«éå级为ç¬å éãå级éçå·¥ä½ä¸ç´æ¥è·å¾ç¬å éç¸åã - äºå¡è·å¾éä¹åï¼å¿ é¡»ç»§ç»ææéç´å°äºå¡ç»æï¼æäº¤æä¸æ¢ï¼ãè¿å°±æ¯ â䏤鶿®µâ è¿ä¸ªååçæ¥æºï¼ç¬¬ä¸é¶æ®µï¼å½äºå¡æ£å¨æ§è¡æ¶ï¼è·åéï¼ç¬¬äºé¶æ®µï¼å¨äºå¡ç»ææ¶ï¼éæ¾ææçéã ç±äºä½¿ç¨äºè¿ä¹å¤çéï¼å æ¤å¾å¯è½ä¼åçï¼äºå¡ A çå¾ äºå¡ B éæ¾å®çéï¼åä¹äº¦ç¶ãè¿ç§æ åµå«å **æ»éï¼Deadlockï¼**ãæ°æ®åºä¼èªå¨æ£æµäºå¡ä¹é´çæ»éï¼å¹¶ä¸æ¢å ¶ä¸ä¸ä¸ªï¼ä»¥ä¾¿å¦ä¸ä¸ªç»§ç»æ§è¡ãè¢«ä¸æ¢çäºå¡éè¦ç±åºç¨ç¨åºéè¯ã #### 䏤鶿®µéå®çæ§è½ 䏤鶿®µéå®ç巨大缺ç¹ï¼ä»¥å 70 å¹´ä»£ä»¥æ¥æ²¡æè¢«ææäººä½¿ç¨çåå ï¼æ¯å ¶æ§è½é®é¢ã䏤鶿®µéå®ä¸çäºå¡ååé䏿¥è¯¢ååºæ¶é´è¦æ¯å¼±é离级å«ä¸è¦å·®å¾å¤ã è¿ä¸é¨åæ¯ç±äºè·ååéæ¾ææè¿äºéçå¼éï¼ä½æ´éè¦çæ¯ç±äºå¹¶åæ§çéä½ãæç §è®¾è®¡ï¼å¦æä¸¤ä¸ªå¹¶åäºå¡è¯å¾åä»»ä½å¯è½å¯¼è´ç«äºæ¡ä»¶çäºæ ï¼é£ä¹å¿ é¡»çå¾ å¦ä¸ä¸ªå®æã ä¼ ç»çå ³ç³»æ°æ®åºä¸éå¶äºå¡çæç»æ¶é´ï¼å 为å®ä»¬æ¯ä¸ºçå¾ äººç±»è¾å ¥ç交äºå¼åºç¨è设计çãå æ¤ï¼å½ä¸ä¸ªäºå¡éè¦çå¾ å¦ä¸ä¸ªäºå¡æ¶ï¼çå¾ çæ¶é¿å¹¶æ²¡æéå¶ãå³ä½¿ä½ ä¿è¯ææçäºå¡é½å¾çï¼å¦ææå¤ä¸ªäºå¡æ³è¦è®¿é®åä¸ä¸ªå¯¹è±¡ï¼é£ä¹å¯è½ä¼å½¢æä¸ä¸ªéåï¼æä»¥äºå¡å¯è½éè¦çå¾ å ä¸ªå ¶ä»äºå¡æè½å®æã å æ¤ï¼è¿è¡ 2PL çæ°æ®åºå¯è½å ·æç¸å½ä¸ç¨³å®çå»¶è¿ï¼å¦æå¨å·¥ä½è´è½½ä¸åå¨äºç¨ï¼é£ä¹å¯è½é«ç¾åä½ç¹å¤çååºä¼éå¸¸çæ ¢ï¼è¯·åé â[æè¿°æ§è½](ch1.md#æè¿°æ§è½)âï¼ãå¯è½åªéè¦ä¸ä¸ªç¼æ ¢çäºå¡ï¼æè ä¸ä¸ªè®¿é®å¤§éæ°æ®å¹¶è·å许å¤éçäºå¡ï¼å°±è½æç³»ç»çå ¶ä»é¨åææ ¢ï¼çè³è¿«ä½¿ç³»ç»åæºãå½éè¦ç¨³å¥çæä½æ¶ï¼è¿ç§ä¸ç¨³å®æ§æ¯æé®é¢çã åºäºéå®ç°ç读已æäº¤é离级å«å¯è½åçæ»éï¼ä½å¨åºäº 2PL å®ç°çå¯ä¸²è¡åé离级å«ä¸ï¼å®ä»¬ä¼åºç°çé¢ç¹çå¤ï¼åå³äºäºå¡çè®¿é®æ¨¡å¼ï¼ãè¿å¯è½æ¯ä¸ä¸ªé¢å¤çæ§è½é®é¢ï¼å½äºå¡ç±äºæ»éèè¢«ä¸æ¢å¹¶è¢«éè¯æ¶ï¼å®éè¦ä»å¤´éåå®çå·¥ä½ã妿æ»éå¾é¢ç¹ï¼è¿å¯è½æå³çå·¨å¤§çæµªè´¹ã #### è°è¯é å¨åé¢å ³äºéçæè¿°ä¸ï¼æä»¬æ©çäºä¸ä¸ªå¾®å¦èéè¦çç»èãå¨ â[导è´åå ¥åå·®ç幻读](#导è´åå ¥åå·®ç幻读)â ä¸ï¼æä»¬è®¨è®ºäº **幻读ï¼phantomsï¼** çé®é¢ãå³ä¸ä¸ªäºå¡æ¹åå¦ä¸ä¸ªäºå¡çæç´¢æ¥è¯¢çç»æãå ·æå¯ä¸²è¡åé离级å«çæ°æ®åºå¿ 须鲿¢ **幻读**ã å¨ä¼è®®å®¤é¢è®¢çä¾åä¸ï¼è¿æå³ç妿ä¸ä¸ªäºå¡å¨æä¸ªæ¶é´çªå£å æç´¢äºä¸ä¸ªæ¿é´çç°æé¢è®¢ï¼è§ [ä¾ 7-2]()ï¼ï¼åå¦ä¸ä¸ªäºå¡ä¸è½åæ¶æå ¥ææ´æ°å䏿¶é´çªå£ä¸å䏿¿é´çå¦ä¸ä¸ªé¢è®¢ ï¼å¯ä»¥åæ¶æå ¥å ¶ä»æ¿é´çé¢è®¢ï¼æå¨ä¸å½±åå¦ä¸ä¸ªé¢å®çæ¡ä»¶ä¸é¢å®å䏿¿é´çå ¶ä»æ¶é´æ®µï¼ã å¦ä½å®ç°è¿ä¸ç¹ï¼ä»æ¦å¿µä¸è®²ï¼æä»¬éè¦ä¸ä¸ª **è°è¯éï¼predicate lockï¼**ã3ããå®ç±»ä¼¼äºåé¢æè¿°çå ±äº« / æå®éï¼ä½ä¸å±äºç¹å®ç对象ï¼ä¾å¦ï¼è¡¨ä¸çä¸è¡ï¼ï¼å®å±äºææç¬¦åæäºæç´¢æ¡ä»¶ç对象ï¼å¦ï¼ ```sql SELECT * FROM bookings WHERE room_id = 123 AND end_time > '2018-01-01 12:00' AND start_time < '2018-01-01 13:00'; ``` è°è¯ééå¶è®¿é®ï¼å¦ä¸æç¤ºï¼ - 妿äºå¡ A æ³è¦è¯»åå¹é æäºæ¡ä»¶ç对象ï¼å°±åå¨è¿ä¸ª `SELECT` æ¥è¯¢ä¸é£æ ·ï¼å®å¿ é¡»è·åæ¥è¯¢æ¡ä»¶ä¸ç **å ±äº«è°è¯éï¼shared-mode predicate lockï¼**ã妿å¦ä¸ä¸ªäºå¡ B ææä»»ä½æ»¡è¶³è¿ä¸æ¥è¯¢æ¡ä»¶å¯¹è±¡çæå®éï¼é£ä¹ A å¿ é¡»çå° B éæ¾å®çéä¹åæå 许è¿è¡æ¥è¯¢ã - 妿äºå¡ A æ³è¦æå ¥ï¼æ´æ°æå é¤ä»»ä½å¯¹è±¡ï¼åå¿ é¡»é¦å æ£æ¥æ§å¼ææ°å¼æ¯å¦ä¸ä»»ä½ç°æçè°è¯éå¹é ã妿äºå¡ B ææå¹é çè°è¯éï¼é£ä¹ A å¿ é¡»çå° B å·²ç»æäº¤æä¸æ¢åæè½ç»§ç»ã è¿éçå ³é®ææ³æ¯ï¼è°è¯éçè³éç¨äºæ°æ®åºä¸å°ä¸åå¨ï¼ä½å°æ¥å¯è½ä¼æ·»å ç对象ï¼å¹»è±¡ï¼ã妿䏤鶿®µéå®å å«è°è¯éï¼åæ°æ®åºå°é»æ¢ææå½¢å¼çåå ¥åå·®åå ¶ä»ç«äºæ¡ä»¶ï¼å æ¤å ¶é离å®ç°äºå¯ä¸²è¡åã #### ç´¢å¼èå´é ä¸å¹¸çæ¯è°è¯éæ§è½ä¸ä½³ï¼**å¦ææ´»è·äºå¡ææå¾å¤éï¼æ£æ¥å¹é çéä¼éå¸¸èæ¶ã** å æ¤ï¼å¤§å¤æ°ä½¿ç¨ 2PL çæ°æ®åºå®é ä¸å®ç°äºç´¢å¼èå´éï¼index-range lockingï¼ä¹ç§°ä¸º **next-key locking**ï¼ï¼è¿æ¯ä¸ä¸ªç®åçè¿ä¼¼çè°è¯éã41,50ãã éè¿ä½¿è°è¯å¹é å°ä¸ä¸ªæ´å¤§çé忥ç®åè°è¯éæ¯å®å ¨çãä¾å¦ï¼å¦æä½ æå¨ä¸ååä¸å 1 ç¹ä¹é´é¢è®¢ 123 å·æ¿é´çè°è¯éï¼åéå® 123 å·æ¿é´çæææ¶é´æ®µï¼æè éå® 12:00~13:00 æ¶é´æ®µçæææ¿é´ï¼ä¸åªæ¯ 123 å·æ¿é´ï¼æ¯ä¸ä¸ªå®å ¨çè¿ä¼¼ï¼å ä¸ºä»»ä½æ»¡è¶³åå§è°è¯çåå ¥ä¹ä¸å®ä¼æ»¡è¶³è¿ç§æ´æ¾æ£çè¿ä¼¼ã 卿¿é´é¢è®¢æ°æ®åºä¸ï¼ä½ å¯è½ä¼å¨ `room_id` å䏿ä¸ä¸ªç´¢å¼ï¼å¹¶ä¸ / æè å¨ `start_time` å `end_time` ä¸æç´¢å¼ï¼å¦ååé¢çæ¥è¯¢å¨å¤§åæ°æ®åºä¸çé度ä¼éå¸¸æ ¢ï¼ï¼ - åè®¾ä½ çç´¢å¼ä½äº `room_id` ä¸ï¼å¹¶ä¸æ°æ®åºä½¿ç¨æ¤ç´¢å¼æ¥æ¾ 123 å·æ¿é´çç°æé¢è®¢ãç°å¨æ°æ®åºå¯ä»¥ç®åå°å°å ±äº«ééå å°è¿ä¸ªç´¢å¼é¡¹ä¸ï¼æç¤ºäºå¡å·²æç´¢ 123 å·æ¿é´ç¨äºé¢è®¢ã - æè ï¼å¦ææ°æ®åºä½¿ç¨åºäºæ¶é´çç´¢å¼æ¥æ¥æ¾ç°æé¢è®¢ï¼é£ä¹å®å¯ä»¥å°å ±äº«ééå å°è¯¥ç´¢å¼ä¸çä¸ç³»åå¼ï¼æç¤ºäºå¡å·²ç»å° 12:00~13:00 æ¶é´æ®µæ 记为ç¨äºé¢å®ã æ 论åªç§æ¹å¼ï¼æç´¢æ¡ä»¶çè¿ä¼¼å¼é½éå å°å ¶ä¸ä¸ä¸ªç´¢å¼ä¸ãç°å¨ï¼å¦æå¦ä¸ä¸ªäºå¡æ³è¦æå ¥ï¼æ´æ°æå é¤åä¸ä¸ªæ¿é´å / æéå æ¶é´æ®µçé¢è®¢ï¼åå®å°ä¸å¾ä¸æ´æ°ç´¢å¼çç¸åé¨åãå¨è¿æ ·åçè¿ç¨ä¸ï¼å®ä¼éå°å ±äº«éï¼å®å°è¢«è¿«çå°éè¢«éæ¾ã è¿ç§æ¹æ³è½å¤ææé²æ¢å¹»è¯»ååå ¥åå·®ãç´¢å¼èå´éå¹¶ä¸åè°è¯é飿 ·ç²¾ç¡®ï¼å®ä»¬å¯è½ä¼é宿´å¤§èå´ç对象ï¼è䏿¯ç»´æå¯ä¸²è¡åæå¿ éçèå´ï¼ï¼ä½æ¯ç±äºå®ä»¬çå¼éè¾ä½ï¼æä»¥æ¯ä¸ä¸ªå¾å¥½çæè¡·ã å¦ææ²¡æå¯ä»¥æè½½èå´éçç´¢å¼ï¼æ°æ®åºå¯ä»¥éåå°ä½¿ç¨æ´ä¸ªè¡¨ä¸çå ±äº«éãè¿å¯¹æ§è½ä¸å©ï¼å 为å®ä¼é»æ¢ææå ¶ä»äºå¡åå ¥è¡¨æ ¼ï¼ä½è¿æ¯ä¸ä¸ªå®å ¨çåéä½ç½®ã ### å¯ä¸²è¡åå¿«ç §é离 æ¬ç« æç»äºæ°æ®åºä¸å¹¶åæ§å¶ç黯淡ç»é¢ã䏿¹é¢ï¼æä»¬å®ç°äºæ§è½ä¸å¥½ï¼2PLï¼æè 伸缩æ§ä¸å¥½ï¼ä¸²è¡æ§è¡ï¼çå¯ä¸²è¡åé离级å«ãå¦ä¸æ¹é¢ï¼æä»¬ææ§è½è¯å¥½çå¼±é离级å«ï¼ä½å®¹æåºç°åç§ç«äºæ¡ä»¶ï¼ä¸¢å¤±æ´æ°ï¼åå ¥åå·®ï¼å¹»è¯»çï¼ã串è¡åçé离级å«å髿§è½æ¯ä»æ ¹æ¬ä¸ç¸äºçç¾çåï¼ ä¹è®¸ä¸æ¯ï¼ä¸ä¸ªç§°ä¸º **å¯ä¸²è¡åå¿«ç §é离ï¼SSI, serializable snapshot isolationï¼** çç®æ³æ¯é常æåéçã宿ä¾äºå®æ´çå¯ä¸²è¡åé离级å«ï¼ä½ä¸å¿«ç §éç¦»ç¸æ¯åªæå¾å°çæ§è½æå¤±ã SSI æ¯ç¸å½æ°çï¼å®å¨ 2008 年馿¬¡è¢«æè¿°ã40ãï¼å¹¶ä¸æ¯ Michael Cahill çå士论æã51ãç主é¢ã ä»å¤©ï¼SSI æ¢ç¨äºåèç¹æ°æ®åºï¼PostgreSQL9.1 以åçå¯ä¸²è¡åé离级å«ï¼ååå¸å¼æ°æ®åºï¼FoundationDB 使ç¨ç±»ä¼¼çç®æ³ï¼ãç±äº SSI ä¸å ¶ä»å¹¶åæ§å¶æºå¶ç¸æ¯è¿å¾å¹´è½»ï¼è¿å¤äºå¨å®è·µä¸è¯æèªå·±è¡¨ç°çé¶æ®µãä½å®æå¯è½å 为足å¤å¿«è卿ªæ¥æä¸ºæ°çé»è®¤é项ã #### æ²è§ä¸ä¹è§çå¹¶åæ§å¶ ä¸¤é¶æ®µéæ¯ä¸ç§æè°ç **æ²è§å¹¶åæ§å¶æºå¶ï¼pessimisticï¼** ï¼å®æ¯åºäºè¿æ ·çååï¼å¦ææäºæ å¯è½åºéï¼å¦å¦ä¸ä¸ªäºå¡æææçéæè¡¨ç¤ºçï¼ï¼æå¥½çå°æ åµå®å ¨åååä»»ä½äºæ ãè¿å°±åäºæ¥ï¼ç¨äºä¿æ¤å¤çº¿ç¨ç¼ç¨ä¸çæ°æ®ç»æã ä»æç§æä¹ä¸è¯´ï¼ä¸²è¡æ§è¡å¯ä»¥ç§°ä¸ºæ²è§å°äºæè´ï¼å¨äºå¡æç»æé´ï¼æ¯ä¸ªäºå¡å¯¹æ´ä¸ªæ°æ®åºï¼ææ°æ®åºçä¸ä¸ªååºï¼å ·ææå®éï¼ä½ä¸ºå¯¹æ²è§çè¡¥å¿ï¼æä»¬è®©æ¯ç¬äºå¡æ§è¡å¾éå¸¸å¿«ï¼æä»¥åªéè¦çæ¶é´ææ âéâã ç¸æ¯ä¹ä¸ï¼**串è¡åå¿«ç §é离** æ¯ä¸ç§ **ä¹è§ï¼optimisticï¼** çå¹¶åæ§å¶ææ¯ãå¨è¿ç§æ åµä¸ï¼ä¹è§æå³çï¼å¦æå卿½å¨çå±é©ä¹ä¸é»æ¢äºå¡ï¼èæ¯ç»§ç»æ§è¡äºå¡ï¼å¸æä¸åé½ä¼å¥½èµ·æ¥ãå½ä¸ä¸ªäºå¡æ³è¦æäº¤æ¶ï¼æ°æ®åºæ£æ¥æ¯å¦æä»ä¹ä¸å¥½çäºæ åçï¼å³é离æ¯å¦è¢«è¿åï¼ï¼å¦ææ¯çè¯ï¼äºå¡å°è¢«ä¸æ¢ï¼å¹¶ä¸å¿ é¡»éè¯ãåªæå¯ä¸²è¡åçäºå¡æè¢«å 许æäº¤ã ä¹è§å¹¶åæ§å¶æ¯ä¸ä¸ªå¤èçæ³æ³ã52ãï¼å ¶ä¼ç¹å缺ç¹å·²ç»äºè®ºäºå¾é¿æ¶é´ã53ãã妿åå¨å¾å¤ **äºç¨**ï¼contentionï¼å³å¾å¤äºå¡è¯å¾è®¿é®ç¸åç对象ï¼ï¼å表ç°ä¸ä½³ï¼å 为è¿ä¼å¯¼è´å¾å¤§ä¸é¨åäºå¡éè¦ä¸æ¢ãå¦æç³»ç»å·²ç»æ¥è¿æå¤§ååéï¼æ¥èªéè¯äºå¡çé¢å¤è´è½½å¯è½ä¼ä½¿æ§è½åå·®ã 使¯ï¼å¦ææè¶³å¤çå¤ç¨å®¹éï¼å¹¶ä¸äºå¡ä¹é´çäºç¨ä¸æ¯å¤ªé«ï¼ä¹è§çå¹¶åæ§å¶ææ¯å¾å¾æ¯æ²è§çè¦å¥½ãå¯äº¤æ¢çååæä½å¯ä»¥åå°äºç¨ï¼ä¾å¦ï¼å¦æå¤ä¸ªäºå¡åæ¶è¦å¢å ä¸ä¸ªè®¡æ°å¨ï¼é£ä¹åºç¨å¢éç顺åºï¼åªè¦è®¡æ°å¨ä¸å¨åä¸ä¸ªäºå¡ä¸è¯»åï¼å°±æ å ³ç´§è¦äºï¼æä»¥å¹¶åå¢éå¯ä»¥å ¨é¨åºç¨ä¸æ éå²çªã 顾åæä¹ï¼SSI åºäºå¿«ç §é离 ââ ä¹å°±æ¯è¯´ï¼äºå¡ä¸çææè¯»å齿¯æ¥èªæ°æ®åºçä¸è´æ§å¿«ç §ï¼è¯·åé â[å¿«ç §é离åå¯éå¤è¯»å](#å¿«ç §é离åå¯éå¤è¯»)âï¼ã䏿©æçä¹è§å¹¶åæ§å¶ææ¯ç¸æ¯è¿æ¯ä¸»è¦çåºå«ãå¨å¿«ç §é离çåºç¡ä¸ï¼SSI æ·»å äºä¸ç§ç®æ³æ¥æ£æµåå ¥ä¹é´ç串è¡åå²çªï¼å¹¶ç¡®å®è¦ä¸æ¢åªäºäºå¡ã #### åºäºè¿æ¶åæçå³ç å å讨论äºå¿«ç §é离ä¸çåå ¥åå·®ï¼è¯·åé â[åå ¥åæä¸å¹»è¯»](#åå ¥åæä¸å¹»è¯»)âï¼æ¶ï¼æä»¬è§å¯å°ä¸ä¸ªå¾ªç¯æ¨¡å¼ï¼äºå¡ä»æ°æ®åºè¯»åä¸äºæ°æ®ï¼æ£æ¥æ¥è¯¢çç»æï¼å¹¶æ ¹æ®å®çå°çç»æå³å®éåä¸äºæä½ï¼åå ¥æ°æ®åºï¼ã使¯ï¼å¨å¿«ç §éç¦»çæ åµä¸ï¼åå§æ¥è¯¢çç»æå¨äºå¡æäº¤æ¶å¯è½ä¸åæ¯ææ°çï¼å ä¸ºæ°æ®å¯è½å¨å䏿¶é´è¢«ä¿®æ¹ã æ¢å¥è¯è¯´ï¼äºå¡åºäºä¸ä¸ª **åæï¼premiseï¼** éåè¡å¨ï¼äºå¡å¼å§æ¶åçäºå®ï¼ä¾å¦ï¼âç®åæä¸¤åå»çæ£å¨å¼çâï¼ãä¹åå½äºå¡è¦æäº¤æ¶ï¼åå§æ°æ®å¯è½å·²ç»æ¹å ââ åæå¯è½ä¸åæç«ã å½åºç¨ç¨åºè¿è¡æ¥è¯¢æ¶ï¼ä¾å¦ï¼âå½åæå¤å°å»çæ£å¨å¼çï¼âï¼ï¼æ°æ®åºä¸ç¥éåºç¨é»è¾å¦ä½ä½¿ç¨è¯¥æ¥è¯¢ç»æãå¨è¿ç§æ åµä¸ä¸ºäºå®å ¨ï¼æ°æ®åºéè¦å设任ä½å¯¹è¯¥ç»æéçåæ´é½å¯è½ä¼ä½¿è¯¥äºå¡ä¸çåå ¥å徿 æã æ¢èè¨ä¹ï¼äºå¡ä¸çæ¥è¯¢ä¸åå ¥å¯è½åå¨å æä¾èµãä¸ºäºæä¾å¯ä¸²è¡åçé离级å«ï¼å¦æäºå¡å¨è¿æ¶çåæä¸æ§è¡æä½ï¼æ°æ®åºå¿ é¡»è½æ£æµå°è¿ç§æ åµï¼å¹¶ä¸æ¢äºå¡ã æ°æ®åºå¦ä½ç¥éæ¥è¯¢ç»ææ¯å¦å¯è½å·²ç»æ¹åï¼æä¸¤ç§æ åµéè¦èèï¼ - æ£æµå¯¹æ§ MVCC å¯¹è±¡çæ¬ç读åï¼è¯»ä¹åå卿ªæäº¤çåå ¥ï¼ - æ£æµå½±åå å读åçåå ¥ï¼è¯»ä¹ååçåå ¥ï¼ #### æ£æµæ§MVCC读å åæ³ä¸ä¸ï¼å¿«ç §é离é常æ¯éè¿å¤çæ¬å¹¶åæ§å¶ï¼MVCCï¼è§ [å¾ 7-10](img/fig7-10.png)ï¼æ¥å®ç°çãå½ä¸ä¸ªäºå¡ä» MVCC æ°æ®åºä¸çä¸è´å¿«ç §è¯»æ¶ï¼å®å°å¿½ç¥åå¿«ç §æ¶å°æªæäº¤çä»»ä½å ¶ä»äºå¡æåçåå ¥ãå¨ [å¾ 7-10](img/fig7-10.png) ä¸ï¼äºå¡ 43 认为 Alice ç `on_call = true` ï¼å 为äºå¡ 42ï¼ä¿®æ¹ Alice çå¾ å½ç¶æï¼æªè¢«æäº¤ãç¶èï¼å¨äºå¡ 43 æ³è¦æäº¤æ¶ï¼äºå¡ 42 å·²ç»æäº¤ãè¿æå³çå¨è¯»ä¸è´æ§å¿«ç §æ¶è¢«å¿½ç¥çåå ¥å·²ç»çæï¼äºå¡ 43 çåæä¸å为çã  **å¾ 7-10 æ£æµäºå¡ä½æ¶ä» MVCC å¿«ç §è¯»åè¿æ¶çå¼** 为äºé²æ¢è¿ç§å¼å¸¸ï¼æ°æ®åºéè¦è·è¸ªä¸ä¸ªäºå¡ç±äº MVCC å¯è§æ§è§åè忽ç¥å¦ä¸ä¸ªäºå¡çåå ¥ãå½äºå¡æ³è¦æäº¤æ¶ï¼æ°æ®åºæ£æ¥æ¯å¦æä»»ä½è¢«å¿½ç¥çåå ¥ç°å¨å·²ç»è¢«æäº¤ã妿æ¯è¿æ ·ï¼äºå¡å¿ 须䏿¢ã 为ä»ä¹è¦çå°æäº¤ï¼å½æ£æµå°éæ§çè¯»åæ¶ï¼ä¸ºä»ä¹ä¸ç«å³ä¸æ¢äºå¡ 43 ï¼å ä¸ºå¦æäºå¡ 43 æ¯åªè¯»äºå¡ï¼åä¸éè¦ä¸æ¢ï¼å 为没æåå ¥åå·®çé£é©ãå½äºå¡ 43 è¿è¡è¯»åæ¶ï¼æ°æ®åºè¿ä¸ç¥éäºå¡æ¯å¦è¦ç¨åæ§è¡åæä½ãæ¤å¤ï¼äºå¡ 42 å¯è½å¨äºå¡ 43 被æäº¤çæ¶å䏿¢æè å¯è½ä»ç¶æªè¢«æäº¤ï¼å æ¤è¯»åå¯è½ç»ç©¶ä¸æ¯éæ§çãéè¿é¿å ä¸å¿ è¦ç䏿¢ï¼SSI ä¿çäºå¿«ç §é离ä»ä¸è´å¿«ç §ä¸é¿æ¶é´è¯»åçè½åã #### æ£æµå½±åä¹å读åçåå ¥ 第äºç§æ åµè¦èèçæ¯å¦ä¸ä¸ªäºå¡å¨è¯»åæ°æ®ä¹åä¿®æ¹æ°æ®ãè¿ç§æ åµå¦ [å¾ 7-11](img/fig7-11.png) æç¤ºã  **å¾ 7-11 å¨å¯ä¸²è¡åå¿«ç §é离ä¸ï¼æ£æµä¸ä¸ªäºå¡ä½æ¶ä¿®æ¹å¦ä¸ä¸ªäºå¡ç读åã** å¨ä¸¤é¶æ®µéå®çä¸ä¸æä¸ï¼æä»¬è®¨è®ºäºç´¢å¼èå´éï¼è¯·åé â[ç´¢å¼èå´é](#ç´¢å¼èå´é)âï¼ï¼å®å è®¸æ°æ®åºéå®ä¸æä¸ªæç´¢æ¥è¯¢å¹é çææè¡çè®¿é®æï¼ä¾å¦ `WHERE shift_id = 1234`ãå¯ä»¥å¨è¿é使ç¨ç±»ä¼¼çææ¯ï¼é¤äº SSI éä¸ä¼é»å¡å ¶ä»äºå¡ã å¨ [å¾ 7-11](img/fig7-11.png) ä¸ï¼äºå¡ 42 å 43 é½å¨ç次 1234 æ¥æ¾å¼çå»çãå¦æå¨ `shift_id` ä¸æç´¢å¼ï¼åæ°æ®åºå¯ä»¥ä½¿ç¨ç´¢å¼é¡¹ 1234 æ¥è®°å½äºå¡ 42 å 43 读åè¿ä¸ªæ°æ®çäºå®ã ï¼å¦ææ²¡æç´¢å¼ï¼è¿ä¸ªä¿¡æ¯å¯ä»¥å¨è¡¨çº§å«è¿è¡è·è¸ªï¼ãè¿ä¸ªä¿¡æ¯åªéè¦ä¿ç䏿®µæ¶é´ï¼å¨ä¸ä¸ªäºå¡å®æï¼æäº¤æä¸æ¢ï¼ï¼å¹¶ä¸ææçå¹¶åäºå¡å®æä¹åï¼æ°æ®åºå°±å¯ä»¥å¿è®°å®è¯»åçæ°æ®äºã å½äºå¡åå ¥æ°æ®åºæ¶ï¼å®å¿ é¡»å¨ç´¢å¼ä¸æ¥æ¾æè¿æ¾è¯»åå影忰æ®çå ¶ä»äºå¡ãè¿ä¸ªè¿ç¨ç±»ä¼¼äºå¨åå½±åçé®èå´ä¸è·ååéï¼ä½éå¹¶ä¸ä¼é»å¡äºå¡ç´å°å ¶ä»è¯»äºå¡å®æï¼èæ¯åè¦æçº¿ä¸æ ·åªæ¯ç®åéç¥å ¶ä»äºå¡ï¼ä½ 们读è¿çæ°æ®å¯è½ä¸æ¯ææ°çå¦ã å¨ [å¾ 7-11](img/fig7-11.png) ä¸ï¼äºå¡ 43 éç¥äºå¡ 42 å ¶å åè¯»å·²è¿æ¶ï¼åä¹äº¦ç¶ãäºå¡ 42 é¦å æäº¤å¹¶æåï¼å°½ç®¡äºå¡ 43 çåå½±åäº 42 ï¼ä½å 为äºå¡ 43 å°æªæäº¤ï¼æä»¥åå ¥å°æªçæãç¶èå½äºå¡ 43 æ³è¦æäº¤æ¶ï¼æ¥èªäºå¡ 42 çå²çªåå ¥å·²ç»è¢«æäº¤ï¼æä»¥äºå¡ 43 å¿ é¡»ä¸æ¢ã #### å¯ä¸²è¡åå¿«ç §éç¦»çæ§è½ ä¸å¾å¸¸ä¸æ ·ï¼è®¸å¤å·¥ç¨ç»èä¼å½±åç®æ³çå®é 表ç°ãä¾å¦ä¸ä¸ªæè¡¡æ¯è·è¸ªäºå¡ç读åååå ¥ç **ç²åº¦ï¼granularityï¼**ãå¦ææ°æ®åºè¯¦ç»å°è·è¸ªæ¯ä¸ªäºå¡çæ´»å¨ï¼ç»ç²åº¦ï¼ï¼é£ä¹å¯ä»¥åç¡®å°ç¡®å®åªäºäºå¡éè¦ä¸æ¢ï¼ä½æ¯ç°¿è®°å¼éå¯è½åå¾å¾æ¾èãç®ç¥çè·è¸ªé度æ´å¿«ï¼ç²ç²åº¦ï¼ï¼ä½å¯è½ä¼å¯¼è´æ´å¤ä¸å¿ è¦çäºå¡ä¸æ¢ã å¨æäºæ åµä¸ï¼äºå¡å¯ä»¥è¯»å被å¦ä¸ä¸ªäºå¡è¦ççä¿¡æ¯ï¼è¿åå³äºåçäºä»ä¹ï¼ææ¶å¯ä»¥è¯ææ§è¡ç»ææ 论å¦ä½é½æ¯å¯ä¸²è¡åçã PostgreSQL 使ç¨è¿ä¸ªç论æ¥åå°ä¸å¿ è¦ç䏿¢æ¬¡æ°ã11,41ãã ä¸ä¸¤é¶æ®µéå®ç¸æ¯ï¼å¯ä¸²è¡åå¿«ç §é离çæå¤§ä¼ç¹æ¯ä¸ä¸ªäºå¡ä¸éè¦é»å¡çå¾ å¦ä¸ä¸ªäºå¡æææçéãå°±åå¨å¿«ç §é离ä¸ä¸æ ·ï¼åä¸ä¼é»å¡è¯»ï¼åä¹äº¦ç¶ãè¿ç§è®¾è®¡ååä½¿å¾æ¥è¯¢å»¶è¿æ´å¯é¢æµï¼åéæ´å°ãç¹å«æ¯ï¼åªè¯»æ¥è¯¢å¯ä»¥è¿è¡å¨ä¸è´å¿«ç §ä¸ï¼èä¸éè¦ä»»ä½éå®ï¼è¿å¯¹äºè¯»åç¹éçå·¥ä½è´è½½é常æå¸å¼åã ä¸ä¸²è¡æ§è¡ç¸æ¯ï¼å¯ä¸²è¡åå¿«ç §é离并ä¸å±éäºå个 CPU æ ¸çååéï¼FoundationDB å°æ£æµå°ç串è¡åå²çªåå¸å¨å¤å°æºå¨ä¸ï¼å 许æ©å±å°å¾é«çååéãå³ä½¿æ°æ®å¯è½è·¨å¤å°æºå¨è¿è¡ååºï¼äºå¡ä¹å¯ä»¥å¨ä¿è¯å¯ä¸²è¡åé离ç级çåæ¶è¯»åå¤ä¸ªååºä¸çæ°æ®ã54ãã 䏿¢çæ¾èå½±å SSI çæ´ä½è¡¨ç°ãä¾å¦ï¼é¿æ¶é´è¯»åååå ¥æ°æ®çäºå¡å¾å¯è½ä¼åçå²çªå¹¶ä¸æ¢ï¼å æ¤ SSI è¦æ±åæ¶è¯»åçäºå¡å°½éçï¼åªè¯»çé¿äºå¡å¯è½æ²¡é®é¢ï¼ãå¯¹äºæ ¢äºå¡ï¼SSI å¯è½æ¯ä¸¤é¶æ®µéå®æä¸²è¡æ§è¡æ´ä¸ææã ## æ¬ç« å°ç» äºå¡æ¯ä¸ä¸ªæ½è±¡å±ï¼å 许åºç¨ç¨åºåè£ æäºå¹¶åé®é¢åæäºç±»åç硬件å软件æ éä¸åå¨ãåå¼åæ ·çé误被ç®å为ä¸ç§ç®åæ åµï¼**äºå¡ä¸æ¢ï¼transaction abortï¼**ï¼èåºç¨éè¦çä» ä» æ¯éè¯ã 卿¬ç« ä¸ä»ç»äºå¾å¤é®é¢ï¼äºå¡æå©äºé²æ¢è¿äºé®é¢åçãå¹¶éææåºç¨é½æåæ¤ç±»é®é¢å½±åï¼å ·æé常ç®åè®¿é®æ¨¡å¼çåºç¨ï¼ä¾å¦æ¯æ¬¡è¯»ååæ¡è®°å½ï¼å¯è½æ éäºå¡ç®¡çã使¯å¯¹äºæ´å¤æçè®¿é®æ¨¡å¼ï¼äºå¡å¯ä»¥å¤§å¤§åå°éè¦èèçæ½å¨éè¯¯æ æ¯æ°éã å¦ææ²¡æäºå¡å¤çï¼åç§é误æ åµï¼è¿ç¨å´©æºï¼ç½ç»ä¸æï¼åçµï¼ç£çå·²æ»¡ï¼æå¤å¹¶åçï¼æå³çæ°æ®å¯è½ä»¥åç§æ¹å¼åå¾ä¸ä¸è´ãä¾å¦ï¼éè§èåçæ°æ®å¯è½å¾å®¹æä¸æºæ°æ®ä¸åæ¥ãå¦ææ²¡æäºå¡å¤çï¼å°±å¾é¾æ¨æå¤æç交äºè®¿é®å¯è½å¯¹æ°æ®åºé æçå½±åã æ¬ç« æ·±å ¥è®¨è®ºäº **å¹¶åæ§å¶** çè¯é¢ãæä»¬è®¨è®ºäºå 个广æ³ä½¿ç¨çé离级å«ï¼ç¹å«æ¯ **读已æäº¤**ã**å¿«ç §é离**ï¼ææ¶ç§°ä¸ºå¯éå¤è¯»ï¼å **å¯ä¸²è¡å**ãå¹¶éè¿ç ç©¶ç«äºæ¡ä»¶çåç§ä¾åï¼æ¥æè¿°è¿äºé离ççº§ï¼ * è读 ä¸ä¸ªå®¢æ·ç«¯è¯»åå°å¦ä¸ä¸ªå®¢æ·ç«¯å°æªæäº¤çåå ¥ã**读已æäº¤** ææ´å¼ºçé离级å«å¯ä»¥é²æ¢è读ã * èå ä¸ä¸ªå®¢æ·ç«¯è¦çåå ¥äºå¦ä¸ä¸ªå®¢æ·ç«¯å°æªæäº¤çåå ¥ãå 乿æçäºå¡å®ç°é½å¯ä»¥é²æ¢èåã * 读ååå·®ï¼ä¸å¯éå¤è¯»ï¼ å¨åä¸ä¸ªäºå¡ä¸ï¼å®¢æ·ç«¯å¨ä¸åçæ¶é´ç¹ä¼çè§æ°æ®åºçä¸åç¶æã**å¿«ç §é离** ç»å¸¸ç¨äºè§£å³è¿ä¸ªé®é¢ï¼å®å 许äºå¡ä»ä¸ä¸ªç¹å®æ¶é´ç¹çä¸è´æ§å¿«ç §ä¸è¯»åæ°æ®ãå¿«ç §é离éå¸¸ä½¿ç¨ **å¤çæ¬å¹¶åæ§å¶ï¼MVCCï¼** æ¥å®ç°ã * æ´æ°ä¸¢å¤± 两个客æ·ç«¯åæ¶æ§è¡ **读å - ä¿®æ¹ - åå ¥åºå**ãå ¶ä¸ä¸ä¸ªåæä½ï¼å¨æ²¡æåå¹¶å¦ä¸ä¸ªåå ¥åæ´æ åµä¸ï¼ç´æ¥è¦çäºå¦ä¸ä¸ªåæä½çç»æãæä»¥å¯¼è´æ°æ®ä¸¢å¤±ãå¿«ç §é离çä¸äºå®ç°å¯ä»¥èªå¨é²æ¢è¿ç§å¼å¸¸ï¼èå¦ä¸äºå®ç°åéè¦æå¨éå®ï¼`SELECT FOR UPDATE`ï¼ã * ååå·® ä¸ä¸ªäºå¡è¯»åä¸äºä¸è¥¿ï¼æ ¹æ®å®æçå°çå¼ä½åºå³å®ï¼å¹¶å°è¯¥å³å®åå ¥æ°æ®åºã使¯ï¼åå ¥æ¶ï¼è¯¥å³å®çåæä¸åæ¯çå®çãåªæå¯ä¸²è¡åçé离æè½é²æ¢è¿ç§å¼å¸¸ã * 幻读 äºå¡è¯»å符åæäºæç´¢æ¡ä»¶ç对象ãå¦ä¸ä¸ªå®¢æ·ç«¯è¿è¡åå ¥ï¼å½±åæç´¢ç»æãå¿«ç §é离å¯ä»¥é²æ¢ç´æ¥çå¹»å读åï¼ä½æ¯åå ¥åå·®ä¸ä¸æä¸ç幻读éè¦ç¹æ®å¤çï¼ä¾å¦ç´¢å¼èå´éå®ã å¼±é离级å«å¯ä»¥é²æ¢å ¶ä¸ä¸äºå¼å¸¸æ åµï¼ä½è¦æ±ä½ ï¼ä¹å°±æ¯åºç¨ç¨åºå¼å人åæå¨å¤çå©ä½é£äºï¼ä¾å¦ï¼ä½¿ç¨æ¾å¼éå®ï¼ãåªæå¯ä¸²è¡åçé离æè½é²èææè¿äºé®é¢ãæä»¬è®¨è®ºäºå®ç°å¯ä¸²è¡åäºå¡çä¸ç§ä¸åæ¹æ³ï¼ * å颿ä¹ä¸çä¸²è¡æ§è¡ 妿æ¯ä¸ªäºå¡çæ§è¡é度é常快ï¼å¹¶ä¸äºå¡ååéè¶³å¤ä½ï¼è¶³ä»¥å¨å个 CPU æ ¸ä¸å¤çï¼è¿æ¯ä¸ä¸ªç®åèææçéæ©ã * 䏤鶿®µéå® æ°åå¹´æ¥ï¼ä¸¤é¶æ®µéå®ä¸ç´æ¯å®ç°å¯ä¸²è¡åçæ åæ¹å¼ï¼ä½æ¯è®¸å¤åºç¨åºäºæ§è½é®é¢çèèé¿å 使ç¨å®ã * å¯ä¸²è¡åå¿«ç §é离ï¼SSIï¼ ä¸ä¸ªç¸å½æ°çç®æ³ï¼é¿å äºå åæ¹æ³ç大é¨å缺ç¹ãå®ä½¿ç¨ä¹è§çæ¹æ³ï¼å 许äºå¡æ§è¡èæ éé»å¡ãå½ä¸ä¸ªäºå¡æ³è¦æäº¤æ¶ï¼å®ä¼è¿è¡æ£æ¥ï¼å¦ææ§è¡ä¸å¯ä¸²è¡åï¼äºå¡å°±ä¼è¢«ä¸æ¢ã æ¬ç« ä¸ç示ä¾ä¸»è¦æ¯å¨å ³ç³»æ°æ®æ¨¡åçä¸ä¸æä¸ã使¯ï¼æ£å¦å¨è®¨è®ºä¸ï¼æ 论使ç¨åªç§æ°æ®æ¨¡åï¼å¦ â**[å¤å¯¹è±¡äºå¡çéæ±](#å¤å¯¹è±¡äºå¡çéæ±)**â ä¸æè®¨è®ºçï¼äºå¡é½æ¯æä»·å¼çæ°æ®åºåè½ã æ¬ç« ä¸»è¦æ¯å¨åæºæ°æ®åºçä¸ä¸æä¸ï¼æ¢è®¨äºåç§æ³æ³åç®æ³ãåå¸å¼æ°æ®åºä¸çäºå¡ï¼åå¼å ¥äºä¸ç³»åæ°çå°é¾ææï¼æä»¬å°å¨æ¥ä¸æ¥çä¸¤ç« ä¸è®¨è®ºã ## åèæç® 1. Donald D. Chamberlin, Morton M. Astrahan, Michael W. Blasgen, et al.: â[A History and Evaluation of System R](http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.84.348&rep=rep1&type=pdf),â *Communications of the ACM*, volume 24, number 10, pages 632â646, October 1981. [doi:10.1145/358769.358784](http://dx.doi.org/10.1145/358769.358784) 1. Jim N. Gray, Raymond A. Lorie, Gianfranco R. Putzolu, and Irving L. Traiger: â[Granularity of Locks and Degrees of Consistency in a Shared Data Base](http://citeseer.ist.psu.edu/viewdoc/download?doi=10.1.1.92.8248&rep=rep1&type=pdf),â in *Modelling in Data Base Management Systems: Proceedings of the IFIP Working Conference on Modelling in Data Base Management Systems*, edited by G. M. Nijssen, pages 364â394, Elsevier/North Holland Publishing, 1976. Also in *Readings in Database Systems*, 4th edition, edited by Joseph M. Hellerstein and Michael Stonebraker, MIT Press, 2005. ISBN: 978-0-262-69314-1 1. Kapali P. Eswaran, Jim N. Gray, Raymond A. Lorie, and Irving L. Traiger: â[The Notions of Consistency and Predicate Locks in a Database System](http://research.microsoft.com/en-us/um/people/gray/papers/On%20the%20Notions%20of%20Consistency%20and%20Predicate%20Locks%20in%20a%20Database%20System%20CACM.pdf),â *Communications of the ACM*, volume 19, number 11, pages 624â633, November 1976. 1. â[ACID Transactions Are Incredibly Helpful](http://web.archive.org/web/20150320053809/https://foundationdb.com/acid-claims),â FoundationDB, LLC, 2013. 1. John D. Cook: â[ACID Versus BASE for Database Transactions](http://www.johndcook.com/blog/2009/07/06/brewer-cap-theorem-base/),â *johndcook.com*, July 6, 2009. 1. Gavin Clarke: â[NoSQL's CAP Theorem Busters: We Don't Drop ACID](http://www.theregister.co.uk/2012/11/22/foundationdb_fear_of_cap_theorem/),â *theregister.co.uk*, November 22, 2012. 1. Theo Härder and Andreas Reuter: â[Principles of Transaction-Oriented Database Recovery](http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.87.2812&rep=rep1&type=pdf),â *ACM Computing Surveys*, volume 15, number 4, pages 287â317, December 1983. [doi:10.1145/289.291](http://dx.doi.org/10.1145/289.291) 1. Peter Bailis, Alan Fekete, Ali Ghodsi, et al.: â[HAT, not CAP: Towards Highly Available Transactions](http://www.bailis.org/papers/hat-hotos2013.pdf),â at *14th USENIX Workshop on Hot Topics in Operating Systems* (HotOS), May 2013. 1. Armando Fox, Steven D. Gribble, Yatin Chawathe, et al.: â[Cluster-Based Scalable Network Services](http://www.cs.berkeley.edu/~brewer/cs262b/TACC.pdf),â at *16th ACM Symposium on Operating Systems Principles* (SOSP), October 1997. 1. Philip A. Bernstein, Vassos Hadzilacos, and Nathan Goodman: [*Concurrency Control and Recovery in Database Systems*](http://research.microsoft.com/en-us/people/philbe/ccontrol.aspx). Addison-Wesley, 1987. ISBN: 978-0-201-10715-9, available online at *research.microsoft.com*. 1. Alan Fekete, Dimitrios Liarokapis, Elizabeth O'Neil, et al.: â[Making Snapshot Isolation Serializable](https://www.cse.iitb.ac.in/infolab/Data/Courses/CS632/2009/Papers/p492-fekete.pdf),â *ACM Transactions on Database Systems*, volume 30, number 2, pages 492â528, June 2005. [doi:10.1145/1071610.1071615](http://dx.doi.org/10.1145/1071610.1071615) 1. Mai Zheng, Joseph Tucek, Feng Qin, and Mark Lillibridge: â[Understanding the Robustness of SSDs Under Power Fault](https://www.usenix.org/system/files/conference/fast13/fast13-final80.pdf),â at *11th USENIX Conference on File and Storage Technologies* (FAST), February 2013. 1. Laurie Denness: â[SSDs: A Gift and a Curse](https://laur.ie/blog/2015/06/ssds-a-gift-and-a-curse/),â *laur.ie*, June 2, 2015. 1. Adam Surak: â[When Solid State Drives Are Not That Solid](https://blog.algolia.com/when-solid-state-drives-are-not-that-solid/),â *blog.algolia.com*, June 15, 2015. 1. Thanumalayan Sankaranarayana Pillai, Vijay Chidambaram, Ramnatthan Alagappan, et al.: â[All File Systems Are Not Created Equal: On the Complexity of Crafting Crash-Consistent Applications](http://research.cs.wisc.edu/wind/Publications/alice-osdi14.pdf),â at *11th USENIX Symposium on Operating Systems Design and Implementation* (OSDI), October 2014. 1. Chris Siebenmann: â[Unix's File Durability Problem](https://utcc.utoronto.ca/~cks/space/blog/unix/FileSyncProblem),â *utcc.utoronto.ca*, April 14, 2016. 1. Lakshmi N. Bairavasundaram, Garth R. Goodson, Bianca Schroeder, et al.: â[An Analysis of Data Corruption in the Storage Stack](http://research.cs.wisc.edu/adsl/Publications/corruption-fast08.pdf),â at *6th USENIX Conference on File and Storage Technologies* (FAST), February 2008. 1. Bianca Schroeder, Raghav Lagisetty, and Arif Merchant: â[Flash Reliability in Production: The Expected and the Unexpected](https://www.usenix.org/conference/fast16/technical-sessions/presentation/schroeder),â at *14th USENIX Conference on File and Storage Technologies* (FAST), February 2016. 1. Don Allison: â[SSD Storage â Ignorance of Technology Is No Excuse](https://blog.korelogic.com/blog/2015/03/24),â *blog.korelogic.com*, March 24, 2015. 1. Dave Scherer: â[Those Are Not Transactions (Cassandra 2.0)](http://web.archive.org/web/20150526065247/http://blog.foundationdb.com/those-are-not-transactions-cassandra-2-0),â *blog.foundationdb.com*, September 6, 2013. 1. Kyle Kingsbury: â[Call Me Maybe: Cassandra](http://aphyr.com/posts/294-call-me-maybe-cassandra/),â *aphyr.com*, September 24, 2013. 1. â[ACID Support in Aerospike](http://www.aerospike.com/docs/architecture/assets/AerospikeACIDSupport.pdf),â Aerospike, Inc., June 2014. 1. Martin Kleppmann: â[Hermitage: Testing the 'I' in ACID](http://martin.kleppmann.com/2014/11/25/hermitage-testing-the-i-in-acid.html),â *martin.kleppmann.com*, November 25, 2014. 1. Tristan D'Agosta: â[BTC Stolen from Poloniex](https://bitcointalk.org/index.php?topic=499580),â *bitcointalk.org*, March 4, 2014. 1. bitcointhief2: â[How I Stole Roughly 100 BTC from an Exchange and How I Could Have Stolen More!](http://www.reddit.com/r/Bitcoin/comments/1wtbiu/how_i_stole_roughly_100_btc_from_an_exchange_and/),â *reddit.com*, February 2, 2014. 1. Sudhir Jorwekar, Alan Fekete, Krithi Ramamritham, and S. Sudarshan: â[Automating the Detection of Snapshot Isolation Anomalies](http://www.vldb.org/conf/2007/papers/industrial/p1263-jorwekar.pdf),â at *33rd International Conference on Very Large Data Bases* (VLDB), September 2007. 1. Michael Melanson: â[Transactions: The Limits of Isolation](http://www.michaelmelanson.net/2014/03/20/transactions/),â *michaelmelanson.net*, March 20, 2014. 1. Hal Berenson, Philip A. Bernstein, Jim N. Gray, et al.: â[A Critique of ANSI SQL Isolation Levels](http://research.microsoft.com/pubs/69541/tr-95-51.pdf),â at *ACM International Conference on Management of Data* (SIGMOD), May 1995. 1. Atul Adya: â[Weak Consistency: A Generalized Theory and Optimistic Implementations for Distributed Transactions](http://pmg.csail.mit.edu/papers/adya-phd.pdf),â PhD Thesis, Massachusetts Institute of Technology, March 1999. 1. Peter Bailis, Aaron Davidson, Alan Fekete, et al.: â[Highly Available Transactions: Virtues and Limitations (Extended Version)](http://arxiv.org/pdf/1302.0309.pdf),â at *40th International Conference on Very Large Data Bases* (VLDB), September 2014. 1. Bruce Momjian: â[MVCC Unmasked](http://momjian.us/main/presentations/internals.html#mvcc),â *momjian.us*, July 2014. 1. Annamalai Gurusami: â[Repeatable Read Isolation Level in InnoDB â How Consistent Read View Works](https://blogs.oracle.com/mysqlinnodb/entry/repeatable_read_isolation_level_in),â *blogs.oracle.com*, January 15, 2013. 1. Nikita Prokopov: â[Unofficial Guide to Datomic Internals](http://tonsky.me/blog/unofficial-guide-to-datomic-internals/),â *tonsky.me*, May 6, 2014. 1. Baron Schwartz: â[Immutability, MVCC, and Garbage Collection](http://www.xaprb.com/blog/2013/12/28/immutability-mvcc-and-garbage-collection/),â *xaprb.com*, December 28, 2013. 1. J. Chris Anderson, Jan Lehnardt, and Noah Slater: *CouchDB: The Definitive Guide*. O'Reilly Media, 2010. ISBN: 978-0-596-15589-6 1. Rikdeb Mukherjee: â[Isolation in DB2 (Repeatable Read, Read Stability, Cursor Stability, Uncommitted Read) with Examples](http://mframes.blogspot.co.uk/2013/07/isolation-in-cursor.html),â *mframes.blogspot.co.uk*, July 4, 2013. 1. Steve Hilker: â[Cursor Stability (CS) â IBM DB2 Community](http://www.toadworld.com/platforms/ibmdb2/w/wiki/6661.cursor-stability-cs.aspx),â *toadworld.com*, March 14, 2013. 1. Nate Wiger: â[An Atomic Rant](http://www.nateware.com/an-atomic-rant.html),â *nateware.com*, February 18, 2010. 1. Joel Jacobson: â[Riak 2.0: Data Types](http://blog.joeljacobson.com/riak-2-0-data-types/),â *blog.joeljacobson.com*, March 23, 2014. 1. Michael J. Cahill, Uwe Röhm, and Alan Fekete: â[Serializable Isolation for Snapshot Databases](http://www.cs.nyu.edu/courses/fall12/CSCI-GA.2434-001/p729-cahill.pdf),â at *ACM International Conference on Management of Data* (SIGMOD), June 2008. [doi:10.1145/1376616.1376690](http://dx.doi.org/10.1145/1376616.1376690) 1. Dan R. K. Ports and Kevin Grittner: â[Serializable Snapshot Isolation in PostgreSQL](http://drkp.net/papers/ssi-vldb12.pdf),â at *38th International Conference on Very Large Databases* (VLDB), August 2012. 1. Tony Andrews: â[Enforcing Complex Constraints in Oracle](http://tonyandrews.blogspot.co.uk/2004/10/enforcing-complex-constraints-in.html),â *tonyandrews.blogspot.co.uk*, October 15, 2004. 1. Douglas B. Terry, Marvin M. Theimer, Karin Petersen, et al.: â[Managing Update Conflicts in Bayou, a Weakly Connected Replicated Storage System](http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.141.7889&rep=rep1&type=pdf),â at *15th ACM Symposium on Operating Systems Principles* (SOSP), December 1995. [doi:10.1145/224056.224070](http://dx.doi.org/10.1145/224056.224070) 1. Gary Fredericks: â[Postgres Serializability Bug](https://github.com/gfredericks/pg-serializability-bug),â *github.com*, September 2015. 1. Michael Stonebraker, Samuel Madden, Daniel J. Abadi, et al.: â[The End of an Architectural Era (Itâs Time for a Complete Rewrite)](http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.137.3697&rep=rep1&type=pdf),â at *33rd International Conference on Very Large Data Bases* (VLDB), September 2007. 1. John Hugg: â[H-Store/VoltDB Architecture vs. CEP Systems and Newer Streaming Architectures](https://www.youtube.com/watch?v=hD5M4a1UVz8),â at *Data @Scale Boston*, November 2014. 1. Robert Kallman, Hideaki Kimura, Jonathan Natkins, et al.: â[H-Store: A High-Performance, Distributed Main Memory Transaction Processing System](http://www.vldb.org/pvldb/1/1454211.pdf),â *Proceedings of the VLDB Endowment*, volume 1, number 2, pages 1496â1499, August 2008. 1. Rich Hickey: â[The Architecture of Datomic](http://www.infoq.com/articles/Architecture-Datomic),â *infoq.com*, November 2, 2012. 1. John Hugg: â[Debunking Myths About the VoltDB In-Memory Database](http://voltdb.com/blog/debunking-myths-about-voltdb-memory-database),â *voltdb.com*, May 12, 2014. 1. Joseph M. Hellerstein, Michael Stonebraker, and James Hamilton: â[Architecture of a Database System](http://db.cs.berkeley.edu/papers/fntdb07-architecture.pdf),â *Foundations and Trends in Databases*, volume 1, number 2, pages 141â259, November 2007. [doi:10.1561/1900000002](http://dx.doi.org/10.1561/1900000002) 1. Michael J. Cahill: â[Serializable Isolation for Snapshot Databases](http://cahill.net.au/wp-content/uploads/2010/02/cahill-thesis.pdf),â PhD Thesis, University of Sydney, July 2009. 1. D. Z. Badal: â[Correctness of Concurrency Control and Implications in Distributed Databases](http://ieeexplore.ieee.org/abstract/document/762563/),â at *3rd International IEEE Computer Software and Applications Conference* (COMPSAC), November 1979. 1. Rakesh Agrawal, Michael J. Carey, and Miron Livny: â[Concurrency Control Performance Modeling: Alternatives and Implications](http://www.eecs.berkeley.edu/~brewer/cs262/ConcControl.pdf),â *ACM Transactions on Database Systems* (TODS), volume 12, number 4, pages 609â654, December 1987. [doi:10.1145/32204.32220](http://dx.doi.org/10.1145/32204.32220) 1. Dave Rosenthal: â[Databases at 14.4MHz](http://web.archive.org/web/20150427041746/http://blog.foundationdb.com/databases-at-14.4mhz),â *blog.foundationdb.com*, December 10, 2014. ------ | ä¸ä¸ç« | ç®å½ | ä¸ä¸ç« | | ---------------------- | ------------------------------- | ---------------------------------- | | [第å ç« ï¼ååº](ch6.md) | [è®¾è®¡æ°æ®å¯éååºç¨](README.md) | [ç¬¬å «ç« ï¼åå¸å¼ç³»ç»ç麻ç¦](ch8.md) |