Mysql事务的实现原理

 

事务理论概述:https://blog.csdn.net/hla199106/article/details/48348261

MySQL 是一个支持多引擎的系统,但并不是所有的引擎都支持事务。比如 MySQL 原生的 MyISAM 引擎就不支持事务,这也是 MyISAM 被 InnoDB 取代的重要原因之一。

4个隔离级别:read uncommited ,read commited ,repeatable read ,serializable 。

 

数据库里面会创建一个视图,访问的时候以视图的逻辑结果为准

“可重复读”隔离级别下,这个视图是在事务启动时创建的,整个事务存在期间都用这个视图

“读提交”隔离级别下,这个视图是在每个 SQL语句开始执行的时候创建的

“读未提交”隔离级别下直接返回记录上的最新值,没有视图概念

“串行化”隔离级别下直接用加锁的方式来避免并行访问

配置方式:将启动参数 transaction-isolation 的值设置成 READ-COMMITTED

 

事务隔离的实现: 展开说明“可重复读”

在 MySQL 中,实际上每条记录在更新的时候都会同时记录一条回滚操作。记录上的最新值,通过回滚操作,都可以得到前一个状态的值。

假设一个值从 1 被按顺序改成了 2、3、4,在回滚日志里面就会有类似下面的记录。

Mysql事务的实现原理_第1张图片

Mysql事务的实现原理_第2张图片

 

 

事务启动方式

1.显式启动事务语句,begin或者start transaction,提交commit,回滚rollback;

2.set autocommit=0,该命令会把这个线程的自动提交关掉。这样只要执行一个select语句,事务就启动,并不会自动提交,直到主动执行commit或rollback或断开连接。

建议使用方法一,如果考虑多一次交互问题,可以使用commit work and chain语法。在autocommit=1的情况下用begin显式启动事务,如果执行commit则提交事务。如果执行commit work and chain则提交事务并自动启动下一个事务。

 

事务启动时机:

begin/start transaction 命令并不是一个事务的起点,在执行到它们之后的第一个操作InnoDB 表的语句,事务才真正启动。如果你想要马上启动一个事务,可以使用 start transaction with consistent snapshot 这个命令。

 

MySQL 里,有两个“视图”的概念

一个是 view。它是一个用查询语句定义的虚拟表,在调用的时候执行查询语句并生成结果。创建视图的语法是 create view … ,而它的查询方法与表一样。

另一个是 InnoDB 在实现 MVCC 时用到的一致性读视图,即 consistent read view,用于支持 RC(Read Committed,读提交)和 RR(Repeatable Read,可重复读)隔离级别的实现。

 

“快照”在 MVCC 里是怎么工作的?

 

Mysql事务的实现原理_第3张图片

如图 2 所示,就是一个记录被多个事务连续更新后的状态。

 

Mysql事务的实现原理_第4张图片

Mysql事务的实现原理_第5张图片

 

 

Mysql事务的实现原理_第6张图片

 

Mysql事务的实现原理_第7张图片

一个数据版本,对于一个事务视图来说,除了自己的更新总是可见以外,有三种情况:

1.版本未提交,不可见;

2.版本已提交,但是是在视图创建后提交的,不可见;

3.版本已提交,而且是在视图创建前提交的,可见。

 

更新数据都是先读后写的,而这个读,只能读当前的值,称为“当前读”(current read)

除了 update 语句外,select 语句如果加锁,也是当前读

Mysql事务的实现原理_第8张图片

 

 

Mysql事务的实现原理_第9张图片

你可能感兴趣的:(数据库)