MYSQL——基础知识(SQL事务)

张开发
2026/4/24 17:15:37 15 分钟阅读

分享文章

MYSQL——基础知识(SQL事务)
目录前言一、事务是什么二、事务的四大特性ACID三、MySQL 事务控制语句四、实战案例安全转账五、事务隔离级别Isolation Levels六、自动提交模式AUTOCOMMIT七、事务使用注意事项八、总结事务使用口诀前言在现代数据库系统中事务Transaction是保障数据一致性和完整性的核心机制。无论是银行转账、订单支付还是用户注册背后都离不开事务的支撑。想象这样一个场景张三向李四转账 100 元。这需要两步操作张三账户余额减 100李四账户余额加 100。如果第一步成功第二步因系统崩溃失败就会导致资金凭空消失而MySQL 事务正是解决此类问题的“安全锁”——它确保这两步要么全部成功要么全部失败。本文将深入讲解 MySQL 事务的原理、ACID 特性、控制语句、隔离级别及最佳实践。一、事务是什么事务的定义事务是一组 SQL 操作的逻辑单元这些操作被视为一个整体全部执行成功→ 提交COMMIT永久生效任一操作失败→ 回滚ROLLBACK全部撤销。重要前提只有 InnoDB 存储引擎支持事务MyISAM、MEMORY 等引擎不支持事务操作会自动提交。二、事务的四大特性ACID特性英文说明示例原子性Atomicity操作不可分割全做或全不做转账两步必须同时成功或失败一致性Consistency事务前后数据符合业务规则转账后总金额不变1000 → 900100隔离性Isolation并发事务互不干扰A 查余额时B 的未提交转账不可见持久性Durability提交后修改永久保存即使断电已提交的转账不会丢失ACID 是事务的“黄金标准”缺一不可。三、MySQL 事务控制语句1. 开启事务-- 方法1显式开启 START TRANSACTION; -- 或 BEGIN; -- 方法2关闭自动提交 SET AUTOCOMMIT 0; -- 之后每条 DML 都属于事务需手动 COMMIT/ROLLBACK默认行为MySQL 默认AUTOCOMMIT1即每条INSERT/UPDATE/DELETE自动提交2. 提交与回滚-- 提交永久保存更改 COMMIT; -- 回滚撤销所有未提交的更改 ROLLBACK;3. 保存点Savepoint—— 事务中的“检查点”START TRANSACTION; UPDATE accounts SET balance balance - 100 WHERE user_id 1; SAVEPOINT before_transfer; -- 设置保存点 UPDATE accounts SET balance balance 100 WHERE user_id 2; -- 若第二步出错可回滚到保存点 ROLLBACK TO before_transfer; -- 最终决定提交或完全回滚 COMMIT; -- 或 ROLLBACK;优势实现事务内的“部分回滚”提升灵活性。四、实战案例安全转账-- 开启事务 START TRANSACTION; -- 扣款 UPDATE accounts SET balance balance - 100 WHERE user_id 1 AND balance 100; -- 检查扣款是否成功防止余额不足 IF ROW_COUNT() 0 THEN ROLLBACK; SIGNAL SQLSTATE 45000 SET MESSAGE_TEXT 余额不足; END IF; -- 入账 UPDATE accounts SET balance balance 100 WHERE user_id 2; -- 提交 COMMIT;关键点使用ROW_COUNT()验证操作是否生效通过SIGNAL抛出错误终止流程需在存储过程中使用。五、事务隔离级别Isolation Levels并发事务可能引发三大问题问题描述隔离级别解决情况脏读Dirty Read读到其他事务未提交的数据READ COMMITTED 及以上解决不可重复读Non-repeatable Read同一事务内多次读取结果不同REPEATABLE READ 及以上解决幻读Phantom Read同一查询返回新插入的行SERIALIZABLE 解决MySQL 支持的四种隔离级别隔离级别Isolation Level脏读Dirty Read不可重复读Non-repeatable Read幻读Phantom Read性能表现READ UNCOMMITTED允许允许允许最高READ COMMITTED禁止允许允许较高REPEATABLE READMySQL 默认禁止禁止InnoDB 通过 MVCC 解决中等SERIALIZABLE禁止禁止禁止最低串行执行查看与设置隔离级别-- 查看当前会话隔离级别 SELECT transaction_isolation; -- 设置当前会话隔离级别 SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED; -- 设置全局影响新连接 SET GLOBAL TRANSACTION ISOLATION LEVEL REPEATABLE READ;InnoDB 的优化在REPEATABLE READ下InnoDB 通过MVCC多版本并发控制和Next-Key Lock有效避免幻读因此通常无需升级到SERIALIZABLE。六、自动提交模式AUTOCOMMIT模式行为适用场景AUTOCOMMIT1默认每条 DML 自动提交简单脚本、交互式查询AUTOCOMMIT0需手动 COMMIT/ROLLBACK应用程序、复杂业务逻辑在应用程序中使用?php $pdo new PDO(mysql:hostlocalhost;dbnametest, $user, $pass); $pdo-setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); try { $pdo-beginTransaction(); // 相当于 SET AUTOCOMMIT0 START TRANSACTION $pdo-exec(UPDATE accounts SET balance balance - 100 WHERE user_id 1); $pdo-exec(UPDATE accounts SET balance balance 100 WHERE user_id 2); $pdo-commit(); // 提交 } catch (Exception $e) { $pdo-rollback(); // 回滚 throw $e; } ?最佳实践应用程序中始终使用beginTransaction()commit()/rollback()。七、事务使用注意事项避免长事务长时间未提交的事务会占用大量 undo 日志阻塞 purge 线程增加死锁概率。合理选择隔离级别大多数场景REPEATABLE READ默认足够Oracle/SQL Server 默认是READ COMMITTED注意兼容性。死锁处理InnoDB 会自动检测死锁并回滚代价较小的事务。应用层应捕获Deadlock found错误并重试。不要在事务中处理用户交互事务期间等待用户输入会导致锁长时间持有影响并发性能。八、总结事务使用口诀“InnoDB 才支持ACID 要记牢BEGIN 开事务COMMIT 才生效出错就 ROLLBACK保存点更灵活默认可重复读长事务要避免”掌握 MySQL 事务不仅是写出正确代码的基础更是构建高可靠、高并发系统的必备技能。合理运用事务让你的数据在任何情况下都坚如磐石

更多文章