探索A级网站的无限可能:数字时代的崭新篇章
MySQL 事务����作�隔离级别深度解�
事务概述
事务的�交��滚�作
事务的隔离级别
事务隔离级别的�置�验�
事务概述事务是处ç�†å¤�æ�‚æ•°æ�®æ“�ä½œçš„æ ¸å¿ƒæœºåˆ¶å°¤å…¶é€‚ç”¨äº�æ“�作é‡�大ã€�逻辑关è�”性强的场景。例如在ä¼�业级人员管ç�†ç³»ç»Ÿä¸åˆ 除一å��员工的æ“�作并é��ä»…åˆ é™¤å…¶åŸºç¡€ä¿¡æ�¯å�³å�¯è¿˜éœ€å�Œæ¥æ¸…ç�†è¯¥å‘˜å·¥å…³è�”的邮箱记录ã€�å�‘å¸ƒçš„æ–‡ç« ã€�å�‚ä¸�çš„é¡¹ç›®ç‰æ•°æ�®ã€‚这些相互关è�”的数æ�®åº“æ“�作è¯å�¥å¿…须作为一个整体执行è¦�么全部完æˆ�è¦�么全部å›�é€€è€Œäº‹åŠ¡æ£æ˜¯ä¿�障这一执行逻辑的关键。PSä»… InnoDB å˜å‚¨å¼•æ“�的数æ�®åº“或数æ�®è¡¨æ”¯æŒ�事务MyISAM ç‰å…¶ä»–引æ“�åˆ™æ— æ¤ç‰¹æ€§äº‹åŠ¡çš„æ ¸å¿ƒä»·å€¼ä½“ç�°åœ¨å››å¤§ç‰¹æ€§ACID上å�Ÿå�性Atomicity事务是ä¸�å�¯åˆ†å‰²çš„æœ€å°�执行å�•元其内部所有æ“�作è¦�么全部æˆ�功执行并æŒ�久化è¦�么在任æ„�ç�¯èŠ‚å‡ºé”™æ—¶æ•´ä¸ªäº‹åŠ¡å›�滚至执行å‰�的状æ€�如å�Œä»�未执行过一致性Consistency事务执行å‰�å��æ•°æ�®åº“的完整性约æ�Ÿå¦‚主键唯一ã€�外键关è�”ã€�å—æ®µæ ¡éªŒè§„则ç‰å§‹ç»ˆä¿�æŒ�有效。例如电商订å�•创建时订å�•金é¢�需ç‰äº�商å“�总价 è¿�费事务执行å��该ç‰å¼�å¿…é¡»æˆ�ç«‹ä¸”åº“å˜æ‰£å‡�ä¸�订å�•æ•°é‡�需匹é…�ç¡®ä¿�æ•°æ�®é€»è¾‘æ— çŸ›ç›¾éš”ç¦»æ€§Isolationæ•°æ�®åº“å…�许多个事务并å�‘执行隔离性å�¯é˜²æ¢äº‹åŠ¡é—´çš„ç›¸äº’å¹²æ‰°é�¿å…�å› äº¤å�‰æ‰§è¡Œå¯¼è‡´çš„æ•°æ�®ä¸�一致。ä¸�å�Œéš”离级别下事务间的隔离程度ä¸�å�Œç›´æ�¥å½±å“�å¹¶å�‘æ“�作的安全性ä¸�性能æŒ�久性Durability事务一旦æ��交对数æ�®çš„修改将永久ä¿�å˜è‡³æ•°æ�®åº“å�³ä¾¿å��ç»å�‘生æœ�务器宕机ã€�ç³»ç»Ÿå´©æºƒç‰æ•…障已æ��交的数æ�®ä¹Ÿä¸�会丢失
事务的æ��交ä¸�å›�滚æ“�作MySQL 默认开å�¯è‡ªåЍæ��交æ¯�执行一æ�¡INSERTã€�UPDATEã€�DELETEè¯å�¥ç³»ç»Ÿä¼šè‡ªåЍéš�å¼�æ��交事务这æ„�味ç�€å�•æ�¡ DML è¯å�¥æœ¬èº«å°±æ˜¯ä¸€ä¸ªç‹¬ç«‹äº‹åŠ¡ã€‚ä½†åœ¨å¤�æ�‚ä¸šåŠ¡åœºæ™¯ä¸æˆ‘们需è¦�手动æ�§åˆ¶äº‹åŠ¡çš„è¾¹ç•Œæ¤æ—¶éœ€æ˜¾å¼�å¼€å�¯äº‹åС关é—自动æ��交。1ã€�å¼€å�¯äº‹åŠ¡ä½¿ç”¨BEGIN或START TRANSACTIONè¯å�¥æ˜¾å¼�å¼€å�¯äº‹åŠ¡æ¤æ—¶å��ç»çš„ DML è¯å�¥å°†è¿›å…¥å�Œä¸€äº‹åŠ¡ä¸Šä¸‹æ–‡ç›´è‡³æ‰§è¡ŒCOMMIT或ROLLBACKæ‰�结æ�Ÿäº‹åŠ¡mysqlBEGIN;-- ç‰ä»·äº� START TRANSACTIONå¼€å�¯äº‹åŠ¡Query OK,0rowsaffected(
00sec)2��交事务COMMIT或COMMIT WORK用��交事务将事务内所有 DML �作的结�永久写入数�库�时��自动�交模�。mysqlCOMMIT;-- �交事务所有修改生效Query OK,0rowsaffected(
01sec)3ã€�å›�滚事务ROLLBACK用äº�撤销当å‰�事务内未æ��交的所有修改将数æ�®è¿˜å�Ÿè‡³äº‹åС开å�¯å‰�的状æ€�。å›�滚仅对未æ��交的事务有效若事务已æ��äº¤æ— æ³•é€šè¿‡ROLLBACK撤销。一个完整的事务å›�滚案例-- å¼€å�¯äº‹åС关é—自动æ��交mysqlSTARTTRANSACTION;Query OK,0rowsaffected(
03sec)-- 执行多��入�作mysqlINSERTINTOdeptVALUES(60,DAHE,ZHIQUAN);Query OK,1rowaffected(
00sec)mysqlINSERTINTOdeptVALUES(70,DAHE,ZHIQUAN);Query OK,1rowaffected(
00sec)mysqlINSERTINTOdeptVALUES(80,DAHE,ZHIQUAN);Query OK,1rowaffected(
00sec)-- 查看事务内的临时数æ�®æ¤æ—¶æ•°æ�®æœªæ��交仅当å‰�会è¯�å�¯è§�mysqlSELECT*FROMdept;------------------------------|DEPTNO|DNAME|LOC|------------------------------|10|ACCOUNTING|NEW YORK||20|RESEARCH|DALLAS||30|SALES|CHICAGO||40|OPERATIONS|BOSTON||60|DAHE|ZHIQUAN||70|DAHE|ZHIQUAN||80|DAHE|ZHIQUAN|------------------------------7rowsinset(
00sec)-- �滚事务撤销所有未�交的�入�作mysqlROLLBACK;Query OK,0rowsaffected(
05sec)-- �次查询数�还�至事务开��的状�mysqlSELECT*FROMdept;------------------------------|DEPTNO|DNAME|LOC|------------------------------|10|ACCOUNTING|NEW YORK||20|RESEARCH|DALLAS||30|SALES|CHICAGO||40|OPERATIONS|BOSTON|------------------------------4rowsinset(
00sec)
事务的隔离级别MySQL æ��供四个ä»�ä½�到高的隔离级别ä¸�å�Œçº§åˆ«å¯¹åº”ä¸�å�Œçš„å¹¶å�‘问题解决能力å�Œæ—¶ä¹Ÿå½±å“�æ•°æ�®åº“的并å�‘性能级别越高并å�‘性能越ä½�在讲解具体级别å‰�需先æ˜�确三个典å�‹çš„å¹¶å�‘æ•°æ�®é—®é¢˜è„�读读å�–到其他事务未æ��交的临时数æ�®è¯¥æ•°æ�®å�¯èƒ½è¢«å›�æ»šæœ€ç»ˆæ— æ•ˆã€‚ä¸�å�¯é‡�å¤�读å�Œä¸€äº‹åŠ¡å†…å¤šæ¬¡è¯»å�–å�Œä¸€æ•°æ�®ç»“æ�œä¸�ä¸€è‡´å› å…¶ä»–äº‹åŠ¡ä¿®æ”¹å¹¶æ��交了该数æ�®ã€‚幻读å�Œä¸€äº‹åŠ¡å†…å¤šæ¬¡æ‰§è¡Œç›¸å�Œçš„æŸ¥è¯¢å¦‚全表扫æ��结æ�œé›†è¡Œæ•°ä¸�ä¸€è‡´å› å…¶ä»–äº‹åŠ¡æ�’å…¥ / åˆ é™¤å¹¶æ��交了数æ�®ã€‚1ã€�读未æ��交Read Uncommitted—— 最ä½�级别规则事务 A å�¯è¯»å�–事务 B 未æ��交的任何修改数æ�®ã€‚è§£å†³é—®é¢˜æ— ä»…ä¿�è¯�事务å�Ÿå�性。å˜åœ¨é—®é¢˜è„�读ã€�ä¸�å�¯é‡�å¤�读ã€�幻读å�‡ä¼šå�‘生。å®�战案例财务人员给员工å�‘工资误将月薪
6 万改为
9 万数æ�®å·²å†™å…¥æ•°æ�®åº“但事务未æ��äº¤ã€‚æ¤æ—¶å‘˜å·¥æŸ¥è¯¢å·¥èµ„看到
9 万的金��数�误以为涨薪��财务��错误�滚事务将金�改�
6 万并�交员工最终�际工资�为
6 万æ¤å‰�读å�–çš„
9 万å�³ä¸ºè„�读。适用场景仅适用äº�对数æ�®ä¸€è‡´æ€§è¦�求æ��ä½�ã€�追求æ��致并å�‘性能的场景2ã€�读已æ��交Read Committed规则事务 A 仅能读å�–事务 B å·²æ��交的修改数æ�®æœªæ��交的数æ�®ä¸�å�¯è§�。解决问题解决è„�读。å˜åœ¨é—®é¢˜ä¸�å�¯é‡�å¤�读ã€�幻读ä»�会å�‘生。å®�战案例程åº�员æŒ�信用å�¡æ¶ˆè´¹æ‰£æ¬¾ç³»ç»Ÿå¼€å�¯äº‹åŠ¡å��第一次查询å�¡å†…ä½™é¢�为
6 ä¸‡æ¤æ—¶ç¨‹åº�员妻å�å¼€å�¯å�¦ä¸€äº‹åС将å�¡å†…全部金é¢�转出并æ��交。扣款系统准备扣款时å†�次查询余é¢�å�‘ç�°é‡‘é¢�为 0å› å¦»å�的事务已æ��交。å�Œä¸€äº‹åŠ¡å†…ä¸¤æ¬¡æŸ¥è¯¢å�Œä¸€ä½™é¢�结æ�œä¸�å�Œå�³ä¸�å�¯é‡�å¤�读。特点这是 Oracleã€�SQL Server ç‰æ•°æ�®åº“的默认隔离级别兼顾一定的一致性ä¸�å¹¶å�‘性能适用äº�大多数普通业务场景3ã€�å�¯é‡�å¤�读Repeatable Read—— MySQL 默认级别规则事务开å�¯å��多次读å�–å�Œä¸€æ•°æ�®çš„结æ�œå§‹ç»ˆä¸€è‡´å�³ä¾¿å…¶ä»–事务修改并æ��交了该数æ�®ã€‚解决问题解决è„�读ã€�ä¸�å�¯é‡�å¤�读。å˜åœ¨é—®é¢˜å¹»è¯»ä»�å�¯èƒ½å�‘生注MySQL InnoDB 引æ“�通过间隙é”�机制在å�¯é‡�å¤�读级别下已基本解决幻读问题这是 MySQL 的优化特性。å®�战案例程åº�员消费时扣款系统开å�¯äº‹åŠ¡å��查询å�¡å†…ä½™é¢�为
6 ä¸‡æ¤æ—¶å¦»å�å°�试转出金é¢�ä½†å› å�¯é‡�å¤�读级别é™�制修改æ“�作需ç‰å¾…扣款事务结æ�Ÿæ‰£æ¬¾ç³»ç»Ÿç¬¬äºŒæ¬¡æŸ¥è¯¢ä½™é¢�ä»�为
6 万确ä¿�扣款æ“�作æ£å¸¸æ‰§è¡Œé�¿å…�ä¸�å�¯é‡�å¤�读。幻读案例补充程åº�员妻å�查询其当日消费记录事务开å�¯ç¬¬ä¸€æ¬¡æŸ¥è¯¢æ˜¾ç¤ºæ¶ˆè´¹ 2000 å…ƒéš�å��程åº�员新å¢�一笔 1 万元的消费并æ��交事务妻å�å†�次执行相å�ŒæŸ¥è¯¢ç»“æ�œæ˜¾ç¤ºæ¶ˆè´¹
2 万元å�³å¹»è¯»ç‰¹ç‚¹å…¼é¡¾ä¸€è‡´æ€§ä¸�å¹¶å�‘性能是 MySQL 的默认级别满足ç»�大多数业务的并å�‘需求。4ã€�串行化Serializable—— 最高级别规则所有事务串行化执行å�³äº‹åŠ¡æ�’队ä¾�次执行完全ç¦�æ¢å¹¶å�‘æ“�作。解决问题解决è„�读ã€�ä¸�å�¯é‡�å¤�读ã€�幻读所有并å�‘问题。å˜åœ¨é—®é¢˜å¹¶å�‘性能æ��ä½�æ•°æ�®åº“å��å��é‡�大幅下é™�。å®�战案例多用户å�Œæ—¶æ“�作å�Œä¸€è®¢å�•表时所有事务需æ�’队执行事务 A 执行æ�’å…¥æ“�作时事务 B 的查询ã€�修改æ“�作需ç‰å¾…事务 A æ��交事务 B 执行时事务 C 需ç‰å¾…以æ¤ç±»æ�¨ã€‚适用场景仅适用äº�对数æ�®ä¸€è‡´æ€§è¦�求æ��高ã€�å‡ ä¹�æ— å¹¶å�‘æ“�作的场景如金è��æ ¸å¿ƒäº¤æ˜“çš„å¯¹è´¦ç�¯èŠ‚ã€‚
事务隔离级别的�置�验�1�查看当�隔离级别MySQL �供系统��transaction_isolation
7 �以上版本旧版本为tx_isolation用�查看隔离级别支�会�级和全局级查询-- 查看当�会�的隔离级别mysqlSELECTtransaction_isolation;-------------------------|transaction_isolation|-------------------------|REPEATABLE-READ|-------------------------1rowinset(
00sec)-- 查看全局隔离级别mysqlSELECTglobal.transaction_isolation;--------------------------------|global.transaction_isolation|--------------------------------|REPEATABLE-READ|--------------------------------1rowinset(
00sec)2ã€�修改隔离级别MySQL 支æŒ�会è¯�级和全局级修改隔离级别修改规则如下会è¯�级修改仅对当å‰�æ•°æ�®åº“è¿�æ�¥ç”Ÿæ•ˆå…³é—è¿�æ�¥å��失效ä¸�å½±å“�其他会è¯�。全局级修改对所有新创建的会è¯�生效已å˜åœ¨çš„会è¯�ä¸�å�—å½±å“�é‡�å�¯æ•°æ�®åº“å��æ�¢å¤�为é…�置文件默认值需修改 my.cnf/my.ini 永久生效。-- 将当å‰�会è¯�隔离级别设置为读已æ��交mysqlSETSESSIONTRANSACTIONISOLATIONLEVELREADCOMMITTED;Query OK,0rowsaffected(
00sec)-- 验�修改结�mysqlSELECTtransaction_isolation;-------------------------|transaction_isolation|-------------------------|READ-COMMITTED|-------------------------1rowinset(
00sec)-- 将全局隔离级别设置为读已�交mysqlSETGLOBALTRANSACTIONISOLATIONLEVELREADCOMMITTED;Query OK,0rowsaffected(
00sec)-- 当�会���留�级别���读mysqlSELECTtransaction_isolation;-------------------------|transaction_isolation|-------------------------|REPEATABLE-READ|-------------------------1rowinset(
00sec)-- 新建一个数�库会�验�全局级别生效mysqlSELECTtransaction_isolation;-------------------------|transaction_isolation|-------------------------|READ-COMMITTED|-------------------------1rowinset(
00sec)3�永久修改隔离级别若需��数�库����隔离级别需修改 MySQL �置文件my.cnf 或 my.ini# 新�以下�置设置全局默认隔离级别为���读transaction-isolationREPEATABLE-READ
数学课代表穿蕾丝吊带背心的作文-数学课代表穿蕾丝吊带背心的作文应用