SQL事务是数据库执行过程中的一个逻辑单元,由一组相关的数据库操作组成,这些操作要么全部执行成功,要么全部不执行,是避免出现数据不一致问题的关键手段。

SQL事务的核心概念与ACID特性
事务的英文是Transaction,在SQL中表示一次完整的业务逻辑操作集合。比如转账场景中,从A账户扣钱和给B账户加钱是两个独立的SQL操作,这两个操作必须绑定在一个事务里,才能保证不会出现A钱扣了但B没收到钱的情况。
所有符合标准的事务都必须满足ACID四大特性,这也是事务能够保障数据一致性的基础:
- 原子性(Atomicity):事务中的所有操作是一个不可分割的整体,要么全部完成,要么全部不生效,不会存在部分执行的情况。
- 一致性(Consistency):事务执行前后,数据库的完整性约束没有被破坏,数据状态符合业务规则的要求。
- 隔离性(Isolation):多个事务同时执行时,每个事务的操作不会被其他事务干扰,事务之间是隔离的。
- 持久性(Durability):事务提交之后,对数据的修改会永久保存到数据库中,即使数据库出现故障也不会丢失。
SQL中事务的基础操作方法
不同的数据库对事务的语法支持略有差异,但核心操作逻辑是一致的,下面以MySQL的InnoDB引擎为例介绍基础操作。
1. 开启事务
可以通过显式语句开启事务,也可以使用隐式开启的方式:
-- 显式开启事务,两种方式效果一致 START TRANSACTION; BEGIN; -- 关闭自动提交,后续所有操作都会在同一个事务中,直到执行提交或回滚 SET autocommit = 0;
2. 提交事务
当事务中的所有操作都执行成功,没有出现异常时,需要提交事务让修改生效:
-- 提交事务,所有操作永久生效 COMMIT; -- 如果之前关闭了自动提交,也可以重新开启自动提交,后续操作会自动提交 SET autocommit = 1;
3. 回滚事务
如果事务执行过程中出现错误,或者需要撤销已经执行的操作,可以回滚事务,让数据恢复到事务开始前的状态:
-- 回滚事务,所有操作撤销,数据恢复到事务开始前的状态 ROLLBACK;
实操示例:转账场景的事务使用
下面是完整的转账事务示例,假设用户A的账户id是1,用户B的账户id是2,A要给B转账100元:
-- 开启事务 START TRANSACTION; -- 第一步:从A账户扣减100元 UPDATE account SET balance = balance - 100 WHERE id = 1; -- 第二步:给B账户增加100元 UPDATE account SET balance = balance + 100 WHERE id = 2; -- 检查两步操作是否都执行成功,这里可以加自定义的业务校验逻辑 -- 如果没有问题,提交事务 COMMIT; -- 如果出现异常,执行回滚 -- ROLLBACK;
事务隔离级别与数据一致性的关系
隔离性是事务的重要特性,不同的隔离级别会影响事务之间的可见性,也会对应不同的数据一致性保障程度。SQL标准定义了四种隔离级别,从低到高分别是:
| 隔离级别 | 脏读 | 不可重复读 | 幻读 | 一致性保障程度 |
|---|---|---|---|---|
| 读未提交(READ UNCOMMITTED) | 可能 | 可能 | 可能 | 最低 |
| 读已提交(READ COMMITTED) | 不可能 | 可能 | 可能 | 中等 |
| 可重复读(REPEATABLE READ) | 不可能 | 不可能 | 可能(InnoDB通过间隙锁解决) | 较高 |
| 串行化(SERIALIZABLE) | 不可能 | 不可能 | 不可能 | 最高 |
其中脏读指一个事务读到了另一个事务还未提交的数据,不可重复读指同一个事务内多次读取同一数据,结果不一致,幻读指同一个事务内多次查询符合条件的记录,记录数量不一致。
设置事务隔离级别的语法如下:
-- 设置当前会话的隔离级别为可重复读 SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ; -- 设置全局隔离级别,新连接会生效 SET GLOBAL TRANSACTION ISOLATION LEVEL READ COMMITTED;
事务使用的注意事项
- 事务中的操作尽量精简,避免长时间占用数据库连接,影响其他操作的执行。
- 不要在事务中执行耗时较长的操作,比如调用外部接口、处理大文件等,会增加锁的持有时间。
- 需要根据业务场景选择合适的隔离级别,隔离级别越高并发性能越差,要在一致性和性能之间做平衡。
- 使用显式事务时,一定要确保有对应的提交或回滚逻辑,避免出现事务长时间未结束导致锁表的问题。
掌握SQL事务的使用方法,能够有效避免多步数据操作中的不一致问题,是开发数据库相关业务时的必备技能。在实际使用中,结合业务场景合理设计事务范围,选择匹配的隔离级别,才能最大化发挥事务的作用。
SQL_transaction数据一致性事务隔离级别ACID特性回滚操作修改时间:2026-07-14 09:39:34