MySQL事务管理是数据库操作中保障数据一致性的重要机制,当我们需要执行多个关联的数据修改操作时,事务可以确保这些操作要么全部成功执行,要么全部失败回滚,避免出现数据不完整的问题。

什么是MySQL事务
事务是一组不可分割的数据库操作序列,这些操作要么全部执行成功,要么全部不执行,是数据库最小的工作单元。在MySQL中,只有使用了InnoDB存储引擎的表才支持事务,MyISAM等存储引擎不支持事务特性。
事务的ACID特性
MySQL事务遵循ACID四大特性,这是事务可靠性的核心保障:
- 原子性(Atomicity):事务中的所有操作是一个整体,要么全部完成,要么全部不完成,不会存在部分执行的情况。
- 一致性(Consistency):事务执行前后,数据库的完整性约束没有被破坏,数据状态符合业务规则。
- 隔离性(Isolation):多个事务并发执行时,一个事务的执行不会被其他事务干扰,每个事务都感觉不到其他事务的存在。
- 持久性(Durability):事务一旦提交,其对数据库的修改就是永久性的,即使数据库发生故障也不会丢失。
事务的基本操作语句
MySQL中事务的常用操作语句如下:
START TRANSACTION或BEGIN:开启一个新的事务。COMMIT:提交事务,将事务中的所有修改持久化到数据库。ROLLBACK:回滚事务,撤销事务中所有未提交的修改。SAVEPOINT 保存点名称:在事务中创建一个保存点,可以后续回滚到该保存点。ROLLBACK TO 保存点名称:回滚到指定的保存点。
事务隔离级别
MySQL支持四种事务隔离级别,不同的隔离级别可以解决不同的并发问题,默认隔离级别是REPEATABLE READ(可重复读):
| 隔离级别 | 脏读 | 不可重复读 | 幻读 |
|---|---|---|---|
| READ UNCOMMITTED(读未提交) | 可能 | 可能 | 可能 |
| READ COMMITTED(读已提交) | 不可能 | 可能 | 可能 |
| REPEATABLE READ(可重复读) | 不可能 | 不可能 | 可能 |
| SERIALIZABLE(串行化) | 不可能 | 不可能 | 不可能 |
可以通过以下语句查看和设置当前会话的事务隔离级别:
-- 查看当前会话的事务隔离级别 SELECT @@transaction_isolation; -- 设置当前会话的事务隔离级别为读已提交 SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;
事务管理示例
下面通过一个转账的场景来演示事务的使用,假设我们有两个账户,需要将账户A的100元转账到账户B:
-- 创建测试表
CREATE TABLE account (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50) NOT NULL,
balance DECIMAL(10,2) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- 插入测试数据
INSERT INTO account (name, balance) VALUES ('张三', 1000.00), ('李四', 500.00);
-- 开启事务
START TRANSACTION;
-- 张三账户扣减100元
UPDATE account SET balance = balance - 100 WHERE name = '张三';
-- 李四账户增加100元
UPDATE account SET balance = balance + 100 WHERE name = '李四';
-- 检查是否出现异常,这里模拟没有异常,提交事务
COMMIT;
-- 如果执行过程中出现异常,可以执行回滚
-- ROLLBACK;
如果我们在执行转账的过程中,比如扣减张三余额之后,增加李四余额之前出现了错误,就可以执行ROLLBACK语句,这样张三被扣减的余额就会恢复,不会出现数据不一致的情况。
事务使用注意事项
- 事务中尽量不要执行耗时较长的操作,比如大量的循环、外部接口调用等,长时间占用事务会导致锁等待问题,影响数据库性能。
- 不要在事务中执行DDL语句(比如
CREATE TABLE、ALTER TABLE等),DDL语句会隐式提交当前事务。 - 合理选择事务隔离级别,隔离级别越高,并发性能越差,需要根据实际业务场景选择合适的级别。
- 事务执行完成后,不管是提交还是回滚,都需要确认事务已经结束,避免未结束的事务占用数据库连接。