一、什么是事务定义事务是数据库中一组不可分割的操作这些操作要么全部成功要么全部失败。关键词原子性例如银行转账张三给李四转 100 元。需要两个操作SQL 1张三余额减少UPDATE account SET money money - 100 WHERE name张三;SQL 2李四余额增加UPDATE account SET money money 100 WHERE name李四;正常张三 -100 李四 100完成。但是如果第一条成功张三 -100第二条失败李四 0结果钱消失了这是绝对不能接受的。事务保证两个操作 成功 一起提交 失败 全部撤销二、事务的基本流程事务通常开启事务 ↓ 执行SQL ↓ 提交 COMMIT 或者 ↓ 回滚 ROLLBACK三、MySQL事务基本语法开启事务START TRANSACTION;或者BEGIN;执行操作UPDATE account SET money money - 100 WHERE id1;提交COMMIT;数据永久保存。回滚ROLLBACK;撤销之前操作。四、事务案例假设账户表idnamemoney1张三10002李四500开始START TRANSACTION;扣钱UPDATE account SET moneymoney-100 WHERE id1;加钱UPDATE account SET moneymoney100 WHERE id2;成功COMMIT;结果namemoney张三900李四600如果第二步失败ROLLBACK;恢复namemoney张三1000李四500五、事务四大特性 ACID ⭐⭐⭐⭐⭐这是面试重点。ACIDA Atomicity C Consistency I Isolation D Durability1. Atomicity原子性含义事务中的操作不可分割要么全部成功要么全部失败。例如转账扣钱 加钱不能只完成一半。对应ROLLBACK2. Consistency一致性含义事务执行前后数据库的数据必须保持正确状态。例如转账前总金额 1500转账后900 600 1500总金额不变。一致性是最终目标。3. Isolation隔离性含义多个事务同时执行时不能互相干扰。例如两个用户同时修改订单。事务A修改订单状态事务B读取订单状态不能看到中间状态。通过锁机制和隔离级别实现。4. Durability持久性含义事务提交后数据永久保存。例如执行COMMIT;然后服务器重启。数据仍然存在。MySQL通过redo log磁盘持久化保证。六、为什么需要事务没有事务例如订单创建需要创建订单INSERT order;扣库存UPDATE product;扣余额UPDATE account;如果订单成功库存失败结果订单存在 库存没减少 钱没扣业务错误。使用事务订单 库存 余额 三个操作 一起成功 或者一起失败七、事务提交方式MySQL 默认autocommit1;表示自动提交。例如执行UPDATE user SET nameTom WHERE id1;立即生效。查看SHOW VARIABLES LIKE autocommit;关闭SET autocommit0;之后需要COMMIT;才保存。八、事务隔离级别 ⭐⭐⭐⭐⭐多个事务同时执行会产生问题问题1脏读问题2不可重复读问题3幻读为了解决这些问题数据库提供隔离级别。MySQL 有四种隔离级别说明READ UNCOMMITTED读未提交READ COMMITTED读已提交REPEATABLE READ可重复读SERIALIZABLE串行化九、查看当前隔离级别MySQL 8SELECT transaction_isolation;通常InnoDB 默认REPEATABLE READ十、三种并发问题1. 脏读Dirty Read定义一个事务读取到了另一个事务未提交的数据。例如事务A修改余额1000→500未提交。事务B读取500事务A回滚1000事务B读取了不存在的数据。这就是脏读。2. 不可重复读定义同一个事务中两次读取同一数据结果不同。例如事务A第一次查询余额1000事务B修改余额500提交。事务A再次查询余额500两次结果不同。3. 幻读定义一个事务读取时发现多了一些不存在的数据。例如事务A查询SELECT * FROM user;返回100条。事务B新增1条用户。事务A再次查询101条。多出来的数据像“幻觉”。十一、MySQL默认隔离级别InnoDB默认REPEATABLE READ原因性能和一致性的平衡。十二、事务在后端中的应用例如 NestJS TypeORM创建订单await queryRunner.startTransaction(); try { await createOrder(); await updateStock(); await updateMoney(); await queryRunner.commitTransaction(); } catch(e){ await queryRunner.rollbackTransaction(); }对应数据库BEGIN SQL1 SQL2 SQL3 COMMIT十三、本节总结概念含义事务一组不可分割操作COMMIT提交事务ROLLBACK回滚事务ACID事务四大特性原子性全部成功或全部失败一致性数据保持正确隔离性事务互不影响持久性提交后永久保存 本节核心一句话事务保证多个数据库操作成为一个不可分割的整体避免业务执行到一半导致数据错误。