事务指的是满足 ACID 特性的一组操作,用 START TRANSACTION 语句开始一个事务,通过 Commit 提交一个事务,使用 Rollback 进行回滚。
1 ACID
- 原子性(Atomicity)
- 事务被视为不可分割的最小单元,事务的所有操作要么全部提交成功,要么全部失败回滚。
- 回滚日志(undo log)记录着事务所执行的修改操作,在回滚时反向执行这些修改操作即可。
- 一致性(Consistency)
- 数据库在事务执行前后都保持一致性状态。
- 隔离性(Isolation)
- 一个事务所做的修改在最终提交以前,对其它事务是不可见的。
- 持久性(Durability)
- 一旦事务提交,则其所做的修改将会永远保存到数据库中。分级别。
- 使用重做日志(redo log)来保证持久性。
2 隔离级别
- 未提交读(READ UNCOMMITTED)
- 事务中的修改,即使没有提交,对其它事务也是可见的。
- 脏读:事务可以读取未提交的数据
- 提交读(READ COMMITTED)
- 一个事务只能读取已经提交的事务所做的修改。
- 不可重复读:两次执行同样的查询,可能会得到不一样的结果(update 和 delete)。
- 可重复读(REPEATABLE READ)
- 默认级别
- 保证在同一个事务中多次读取同样数据的结果是一样的。
- 幻读:读取某个范围记录时,其他事务插入了新记录,再读时,会产生幻行(insert)。
- MVCC + 间隙锁 解决了幻读的问题。
- 可串行化(SERIALIZABLE)
- 强制事务串行执行。
3 MySQL中的事务
3.1 AUTOCOMMIT
MySQL 默认采用自动提交模式。也就是说,如果不是显式地开始一个事务,那么每个查询都会被当做一个事务自动提交。
1 或者 ON 表示启用,0 或者 OFF 表示禁用。
mysql> SHOW VARIABLES LIKE 'AUTOCOMMIT';
mysql> SET AUTOCOMMIT = 1;
3.2 设置隔离级别
MySQL 可以通过执行SET TRANSACTION ISOLATION LEVEL
命令来设置隔离级别。