MySQL 中的事务(Transaction)

发布时间:2026/8/21 8:02:48
MySQL 中的事务(Transaction) 事务是一组操作的集合这些操作要么全部成功要么全部失败保证数据的一致性。它是数据库保证数据完整性的核心机制。一、事务的四大特性ACID特性含义解释原子性Atomicity要么全部成功要么全部失败转账扣钱和加钱必须同时成功或同时失败一致性Consistency事务前后数据状态一致转账前后总金额不变隔离性Isolation事务之间互不干扰两个事务同时操作同一数据时互相不可见持久性Durability事务提交后数据永久保存提交后即使系统崩溃数据也不会丢失二、事务的基本操作1. 控制事务的 SQL 语句语句作用START TRANSACTION/BEGIN开始一个事务COMMIT提交事务将修改永久保存ROLLBACK回滚事务撤销所有修改SAVEPOINT name设置保存点ROLLBACK TO SAVEPOINT name回滚到指定保存点RELEASE SAVEPOINT name删除保存点2. 基本使用-- 开始事务 START TRANSACTION; -- 执行操作 UPDATE accounts SET balance balance - 100 WHERE id 1; UPDATE accounts SET balance balance 100 WHERE id 2; -- 检查结果 SELECT * FROM accounts; -- 提交事务确认修改 COMMIT; -- 或回滚事务撤销修改 -- ROLLBACK;3. 带保存点的事务START TRANSACTION; -- 操作1 UPDATE accounts SET balance balance - 100 WHERE id 1; -- 设置保存点 SAVEPOINT sp1; -- 操作2可能失败 UPDATE accounts SET balance balance 100 WHERE id 2; -- 如果操作2失败回滚到保存点 ROLLBACK TO SAVEPOINT sp1; -- 操作3 UPDATE accounts SET balance balance 100 WHERE id 3; -- 提交事务 COMMIT;三、事务隔离级别1. 隔离级别隔离级别脏读不可重复读幻读并发性能READ UNCOMMITTED可能可能可能最高READ COMMITTED不会可能可能中等REPEATABLE READ不会不会可能较低SERIALIZABLE不会不会不会最低2. 查看和设置隔离级别-- 查看当前隔离级别 SELECT transaction_isolation; -- 或 SHOW VARIABLES LIKE transaction_isolation; -- 设置全局隔离级别 SET GLOBAL transaction_isolation READ-COMMITTED; -- 设置当前会话隔离级别 SET SESSION transaction_isolation READ-COMMITTED;四、隔离级别的并发问题1. 脏读Dirty Read一个事务读取了另一个未提交事务的数据。时间线 事务ABEGIN → 修改数据 → 未提交 事务BBEGIN → 读取数据 → 读到了事务A未提交的数据脏读 事务AROLLBACK撤销修改2. 不可重复读Non-Repeatable Read同一事务内两次读取同一数据结果不同。时间线 事务ABEGIN → 读取数据 → 结果100 事务BBEGIN → 修改数据 → 提交 事务A再次读取数据 → 结果200和第一次不一样3. 幻读Phantom Read同一事务内两次查询结果集的行数不同。时间线 事务ABEGIN → 查询所有用户 → 查到10条 事务BBEGIN → 插入新用户 → 提交 事务A再次查询所有用户 → 查到11条多了1条像幻觉一样五、默认隔离级别版本默认隔离级别MySQL 5.7REPEATABLE READMySQL 8.0REPEATABLE READMySQL 的REPEATABLE READ通过MVCC多版本并发控制解决了幻读问题在 InnoDB 引擎下。其他1、短事务优先事务越短锁持有时间越短并发越高。2、适当的隔离级别根据业务需求选择最低的隔离级别。3、避免事务中交互不要在事务中等待用户输入。