1、事务的概念
事务的ACID特性:
- 原子性(Atomicity):事务中的所有操作被视为一个不可分割的整体,要么全部成功,要么全部失败。
- 一致性(Consistency):事务完成后,数据库从一个有效状态转变为另一个有效状态,保证数据的完整性。
- 隔离性(Isolation):并发执行的事务之间互不影响,如同串行执行一样。
- 持久性(Durability):一旦事务成功提交,其对数据库的更改即使在系统故障后也能持久保存。
1.1、事务的启动与结束
- 事务的启动:通过执行
START TRANSACTION
、BEGIN
语句显式开启一个事务。也可以在配置中设置自动提交(autocommit)为关闭,这样每个SQL语句都会被视为事务的一部分,直到执行COMMIT
或ROLLBACK
为止。 - 事务的提交:使用
COMMIT
语句提交事务。提交时,MySQL会确保所有对数据库的更改都已经正确记录在磁盘上,并释放事务持有的所有锁,使事务的更改对其他事务可见。 - 事务的回滚:使用
ROLLBACK
语句回滚事务。回滚时,MySQL会撤销事务中所有未提交的更改,恢复数据到事务开始前的状态,并释放事务持有的所有锁。
1.2、事务的原子性
原子性保证事务中的所有操作要么全部成功,要么全部失败。MySQL通过以下方式实现原子性:
- Undo Log:每当事务对数据进行修改时,InnoDB存储引擎都会在Undo Log中记录修改前的旧版本。在回滚事务时,MySQL会按照Undo Log中的记录逆序执行相应操作,还原数据到事务开始前的状态。
- 事务的回滚点:在事务开始时,MySQL会设置一个回滚点。如果事务遇到错误或被显式回滚,系统会从回滚点开始应用Undo Log中的操作,撤销所有未提交的更改。
1.3、事务的一致性
一致性要求事务执行前后,数据库始终保持在一种合法状态。MySQL通过以下机制确保一致性:
- 约束检查:在事务执行过程中,MySQL会对插入、更新和删除操作进行约束(如主键、外键、唯一性约束、非空约束等)检查,确保数据满足定义的完整性约束条件。
- 触发器与存储过程:通过使用触发器和存储过程,可以编写复杂的业务规则,确保事务执行时遵循预定义的业务逻辑。
- 应用程序逻辑:应用程序开发者在编写事务中的SQL语句时,需确保它们组成的操作序列最终会使数据库状态符合预期的一致性要求。
1.4、事务的隔离性
隔离性确保并发执行的事务之间互不影响,如同串行执行。MySQL通过以下方式实现隔离性:
- 锁机制:如前所述,MySQL使用各种锁(如行锁、表锁、意向锁等)来控制事务对数据的访问顺序和权限,防止并发事务间的相互干扰。
- MVCC:InnoDB存储引擎通过多版本并发控制(MVCC)机制,使得事务能够读取到其开始时刻的数据视图,而不受其他并发事务未提交更改的影响,从而在大多数情况下避免了锁的使用,提高了并发性能。
1.5、事务的持久性
持久性保证一旦事务成功提交,其对数据库的更改即使在系统故障后也能持久保存。MySQL通过以下方式实现持久性:
- Redo Log(重做日志):InnoDB存储引擎在事务执行过程中,会将对数据的更改先记录到内存中的重做日志缓冲区,然后定期将其刷新到磁盘上的重做日志文件中。在事务提交时,MySQL会确保所有已提交的更改都已经写入到重做日志中。
- 当系统发生故障时,MySQL在重启时会通过重播重做日志中的记录,将已提交但尚未写入数据文件的更改重新应用到数据库中,确保数据的持久性。