深入理解 MySQL 事务:从基础到实战,一篇吃透
在开发和运维 MySQL 数据库的过程中事务Transaction是绕不开的核心知识点它是保证数据库数据安全、一致、可靠的基石。无论是电商下单、银行转账、支付结算还是日常的业务数据操作都离不开事务的支撑。这篇文章会从事务的定义、四大特性ACID、隔离级别、并发问题、事务语法、实战案例、底层原理等维度把 MySQL 事务讲得明明白白新手也能轻松看懂、直接用。一、什么是 MySQL 事务简单来说事务是一组不可分割的数据库操作集合要么全部执行成功要么全部执行失败不会出现中间状态。举个最经典的例子银行转账A 账户给 B 账户转 100 元数据库需要执行两步操作A 账户扣 100 元B 账户加 100 元这两步必须同时成功或者同时失败如果 A 扣钱了、B 没加钱 → 数据错乱用户损失如果 A 没扣钱、B 加钱了 → 银行损失事务就是用来杜绝这种中间状态保证数据绝对可靠。二、事务的四大特性ACID事务的核心就是ACID 四大特性这是面试必问、开发必懂的知识点。1. 原子性Atomicity定义事务是最小的执行单位不可分割。事务中的所有 SQL要么全部执行成功要么全部回滚撤销。只要有一步失败整个事务都作废数据回到执行前的状态。2. 一致性Consistency定义事务执行前后数据库的完整性约束不被破坏。转账前后A 和 B 的总金额不变。数据始终符合业务规则不会出现非法、错乱的数据。3. 隔离性Isolation定义多个事务并发执行时互相不干扰一个事务的中间状态对其他事务不可见。隔离性通过事务隔离级别实现后面会详细讲。4. 持久性Durability定义一旦事务提交成功对数据的修改是永久的。即使数据库宕机、重启数据也不会丢失。依靠 MySQL 的 redo log 实现持久化。三、事务的并发问题不隔离会怎样如果多个事务同时操作同一份数据不做隔离会出现 4 种经典问题1. 脏读Dirty Read一个事务读取到了另一个未提交事务修改的数据。例子事务 1 修改数据但未提交事务 2 读到了这个临时数据结果事务 1 回滚了 → 事务 2 读到的是 “脏数据”。2. 不可重复读Non-Repeatable Read一个事务内多次读取同一行数据结果不一致。原因其他事务在这期间修改并提交了这行数据。3. 幻读Phantom Read一个事务内多次查询的结果集行数不一致。原因其他事务在这期间插入 / 删除了符合条件的数据。4. 丢失更新Lost Update两个事务同时修改同一数据后提交的事务覆盖了先提交的修改。四、事务的四大隔离级别MySQL 提供了4 种隔离级别用来解决上面的并发问题级别从低到高隔离级别脏读不可重复读幻读性能读未提交READ UNCOMMITTED✅ 允许✅ 允许✅ 允许最高读已提交READ COMMITTED❌ 禁止✅ 允许✅ 允许高可重复读REPEATABLE READ❌ 禁止❌ 禁止⚠️ 部分解决中串行化SERIALIZABLE❌ 禁止❌ 禁止❌ 禁止最低重点说明MySQL 默认隔离级别可重复读REPEATABLE READInnoDB 存储引擎在可重复读级别下通过MVCC 间隙锁基本解决了幻读问题。隔离级别越高数据越安全但并发性能越差。生产环境推荐使用读已提交 或 可重复读。五、MySQL 事务基本语法1. 开启事务START TRANSACTION; -- 或者简写 BEGIN;2. 提交事务永久生效COMMIT;3. 回滚事务撤销所有操作ROLLBACK;4. 设置事务隔离级别-- 会话级别当前连接生效 SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED; -- 全局级别所有新连接生效 SET GLOBAL TRANSACTION ISOLATION LEVEL REPEATABLE READ;5. 查看当前隔离级别SELECT transaction_isolation;六、实战案例银行转账事务完整演示1. 创建测试表CREATE TABLE account ( id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(20), balance DECIMAL(10,2) ); INSERT INTO account(name, balance) VALUES (张三, 1000.00), (李四, 1000.00);2. 正常转账提交事务-- 开启事务 BEGIN; -- 1. 张三扣 100 UPDATE account SET balance balance - 100 WHERE name 张三; -- 2. 李四加 100 UPDATE account SET balance balance 100 WHERE name 李四; -- 确认无误提交 COMMIT;执行后张三 900李四 1100 ✅3. 异常转账回滚事务BEGIN; UPDATE account SET balance balance - 100 WHERE name 张三; -- 模拟异常比如程序报错、网络中断 -- 直接回滚所有操作作废 ROLLBACK;执行后数据回到原来的状态没有任何修改✅七、事务的底层原理进阶想真正吃透事务必须了解它的底层实现机制1. redo log重做日志保证持久性记录 “修改了什么数据”数据库宕机重启后通过 redo log 恢复数据2. undo log回滚日志保证原子性记录修改前的数据事务回滚时用 undo log 恢复数据3. MVCC多版本并发控制保证隔离性实现无锁读写提升并发性能是 MySQL 高效处理并发事务的核心八、事务使用注意事项生产必看事务要短小精悍不要在事务里执行耗时操作远程调用、sleep、大量计算否则会导致锁等待、性能暴跌。避免长事务长事务会占用大量 undo log导致数据库性能下降。所有更新操作必须加事务尤其是涉及多表、多行的业务逻辑。不要自动提交生产环境建议关闭自动提交SET autocommit 0;异常必须回滚程序捕获异常时一定要执行ROLLBACK。九、总结事务一组操作要么全成要么全败。ACID原子性、一致性、隔离性、持久性事务的灵魂。并发问题脏读、不可重复读、幻读、丢失更新。隔离级别MySQL 默认可重复读兼顾安全与性能。核心命令BEGIN→ 执行 SQL →COMMIT/ROLLBACK。底层redo log、undo log、MVCC 共同支撑事务。掌握 MySQL 事务你就能写出安全、稳定、高并发的数据库程序这是后端开发的核心基本功。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2470784.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!