在 MySQL 中,事务(Transaction)是一组 SQL 语句的集合,这些语句作为一个单元来执行。事务的主要作用是保证数据库操作的原子性、一致性、隔离性和持久性,即 ACID 特性。
ACID 特性
1.原子性(Atomicity):
- 事务的所有操作要么全部成功,要么全部失败。事务是不可分割的工作单元。
- 如果事务中的任何一个操作失败,整个事务将会回滚到事务开始的状态,所有之前的操作都会被撤销。
2.一致性(Consistency):
- 事务开始和结束时,数据库必须处于一致状态。
- 一致性规则包括数据库约束(如主键、外键约束)和业务规则(如账户余额不能为负)。
3.隔离性(Isolation):
- 事务的执行互不干扰,即每个事务内部的操作和使用的数据在其未提交之前对其他事务是不可见的。
- 不同的隔离级别决定了事务之间的可见性和并发性。
4.持久性(Durability):
- 一旦事务提交,事务对数据库所做的改变是永久性的,即使系统崩溃,也不会丢失。
MySQL 中的事务管理
MySQL 支持事务的存储引擎包括 InnoDB 和 NDB,InnoDB 是默认的存储引擎并且完全支持事务。
基本的事务操作:
1.开始事务:
START TRANSACTION;
2.提交事务:
COMMIT;
3.回滚事务:
ROLLBACK;
4.保存点(Savepoint):
SAVEPOINT savepoint_name;
5.回滚到保存点:
ROLLBACK TO SAVEPOINT savepoint_name;
6.释放保存点:
RELEASE SAVEPOINT savepoint_name;
自动提交模式
MySQL 默认在每个 SQL 语句后自动提交,这称为自动提交模式。如果希望手动管理事务,需要关闭自动提交:
SET autocommit = 0;
关闭后,所有的 SQL 语句将在同一个事务中,直到明确提交或回滚。
事务的隔离级别
隔离级别决定了一个事务中的修改是否对其他事务可见。MySQL 支持四种标准的隔离级
1.读未提交(READ UNCOMMITTED):
最低的隔离级别。一个事务可以看到另一个事务未提交的修改。这可能导致脏读、不可重复读和幻读的问题都会出现。
2.读提交(READ COMMITTED):
一个事务只能看到另一个事务已经提交的修改,可以避免脏读,但不可重复读和幻读的问题仍然可能出现
3.可重复读(REPEATABLE READ):
默认隔离级别。一个事务中的读取操作始终只能看到事务开始时的状态。防止脏读和不可重复读,但可能会出现幻读。
4.可串行化(SERIALIZABLE):
最高的隔离级别。事务按顺序执行,完全避免脏读、不可重复读和幻读,但性能开销最大。
可以使用以下命令查看或设置事务的隔离级别:
-- 查看当前的隔离级别
SELECT @@transaction_isolation;
-- 设置隔离级别为 READ COMMITTED
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;