MySQL - 事务

Mysql  

一、概述

事务将一组相关操作组合为一个要么全部成功,要么全部失败的单元。

1、事务的 四个特性:

(1)原子性 (atomicity)

一个事务是一个不可分割的工作单位,事务中包括的诸操作要么都做,要么都不做。

(2)一致性(consistency)

事务必须是使数据库从一个一致性状态变到另一个一致性状态。一致性与原子性是密切相关的。

(3)隔离性(isolation)

一个事务的执行不被其他事务干扰。即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不互相干扰。

(4)持久性(durability)

一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。接下来的其他操作或故障不应该对其有任何影响。

 
2、事务的应用场景:

通常用于涉及财务信息的、订单信息的、商品库存信息的操作等等。

 

二、事务的实现过程

Mysql事务的实现依赖于事务日志。Mysql中的事务日志有两种:分别是 undo 日志(保证数据一致性)、redo 日志(保证数据原子性和持久性)。
 
1、undo 日志(回滚日志)

Mysql 中,回滚是通过回滚日志(undo log)实现的。所有事务进行的修改都会先记录到这个回滚日志中,然后再对数据库中的对应行进行写入。如果发生异常,则会对已经执行的操作进行回滚。

(日志文件中:在事务中使用的每一条 INSERT 都对应了一条 DELETE,每一条 UPDATE 也都对应一条相反的 UPDATE 语句。)

 
2、redo 日志(重做日志)

undo 日志保证了事务中的所有操作都具有一致性,但这时其实数据还没有持久化到数据库中。这时,如果事务已经 commit 成功,但是突然断电或者服务器宕机了,这时,redo 日志就发挥出用处了。

redo 日志保证了事务中的所有操作都具有原子性和持久性。如果在事务提交后发生错误,能够对已经提交的事务进行重做。

注:

ib_logfile 记录重做日志,ib_data 记录回滚日志,这两个文件都是二进制文件。

使用命令 show variables like 'innodb_log%' 可以查看到 mysql 日志存储位置;

 

三、事务日志流程

checkpoint,即检查点。在undolog中写入检查点,表示在checkpoint前的事务都已经完成commit或者rollback了,也就是检查点前面的事务已经不存在数据一致性的问题了(此处暂时不会深入解释)

Innodb的事务日志是指Redo log,简称Log,保存在日志文件ib_logfile里面(去mysql数据目录下看下)。Innodb还有另外一个日志Undo log,但Undo log是存放在共享表空间里面的(ibdata*文件,存储的是check point日志序列号)。

Innodb的一条事务日志共经历4个阶段:

1、创建阶段:事务创建一条日志;

2、日志刷盘:日志写入到磁盘上的日志文件; (ib_logfile里面)

3、数据刷盘:日志对应的脏页数据写入到磁盘上的数据文件;

4、写CKP:日志被当作Checkpoint写入日志文件;(ib_data里面)  

 

 



Top