0
点赞
收藏
分享

微信扫一扫

事务系列之一事务基础概述

_阿瑶 2022-03-12 阅读 69

事务定义

一组逻辑操作单元,使数据从一种状态变换到另一种状态

一、存储引擎支持情况

二、事务的ACID特性

1、原子性(atomicity)

原子性是指事务是一个不可分割的工作单位,要么全部提交,要么全部失败回滚。

2、一致性(consistency)

一致性是指事务执行前后,数据从一个合法性状态变换到另外一个合法性状态 。这种状态
是语义上的而不是语法上的,跟具体的业务有关。通俗的说,这种状态是由自己定义的(比如要满足现实世界中的约束),满足这个状态,数据就是一致的,不满足这个状态,数据就是不一致的。

3、隔离型(isolation)

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

4、持久性(durability)

持久性是指一个事务一旦被提交,它对数据库中数据的改变就是 永久性的 ,接下来的其他操作和数据库故障不应该对其有任何影响。
持久性是通过事务日志来保证的。日志包括了重做日志和回滚日志 。当我们通过事务对数据进行修改的时候,首先会将数据库的变化信息记录到重做日志中,然后再对数据库中对应的行进行修改。这样做的好处是,即使数据库系统崩溃,数据库重启后也能找到没有更新到数据库系统中的重做日志,重新执行,从而使事务具有持久性。

三、 事务的状态

1、活动的(active)

事务对应的数据库操作正在执行过程中时,我们就说该事务处在 活动的 状态。

2、部分提交的(partially committed)

当事务中的最后一个操作执行完成,但由于操作都在内存中执行,所造成的影响并 没有刷新到磁盘时,我们就说该事务处在 部分提交的 状态。

3、失败的(failed)

当事务处在 活动的 或者 部分提交的 状态时,可能遇到了某些错误(数据库自身的错误、操作系统
错误或者直接断电等)而无法继续执行,或者人为的停止当前事务的执行,我们就说该事务处在 失败的状态。

4、中止的(aborted)

如果事务执行了一部分而变为 失败的 状态,那么就需要把已经修改的事务中的操作还原到事务执
行前的状态。换句话说,就是要撤销失败事务对当前数据库造成的影响。我们把这个撤销的过程称
之为 回滚 。当 回滚 操作执行完毕时,也就是数据库恢复到了执行事务之前的状态,我们就说该事
务处在了 中止的 状态。

5、提交的(committed)

当一个处在 部分提交的 状态的事务将修改过的数据都 同步到磁盘 上之后,我们就可以说该事务处
在了 提交的 状态。

 四、事务的分类

1、显式事务

START TRANSACTION 或者  BEGIN ,作用是显式开启一个事务

START TRANSACTION 语句相较于 BEGIN 特别之处在于,后边能跟随如下修饰符 :

 (1)READ ONLY

标识当前事务是一个 只读事务 ,也就是属于该事务的数据库操作只能读取数据,而不能修改数据。

(2)READ WRITE

标识当前事务是一个 读写事务 ,也就是属于该事务的数据库操作既可以读取数据,也可以修改数据。

(3)WITH CONSISTENT SNAPSHOT

启动一致性读

注意:

(1) 回滚事务。即撤销正在进行的所有没有提交的修改。此时事务结束。但是有一种情况是将事务回滚到某个保存点。

当将事务回滚到某个保存点时,事务没有结束,还需要指定是否继续执行后面命令并最终执行rollback/commit。

 2、隐式事务

MySQL中有一个系统变量 autocommit 

 把系统变量 autocommit 的值设置为 OFF

隐式事务在如下情况下自动提交,即不受autocommit的影响

(1)数据定义语言(Data definition language,缩写为:DDL)

(2)隐式使用或修改mysql数据库中的表

使用alter user,create user,drop user,grant,rname user,revoke,set password等语句时会隐式提交前面执行的语句所在的事务。

(3)事务控制或关于锁定的语句

        1)当一个事务还没有提交或者回滚时,又使用START TRANSACTION 或者  BEGIN语句开启另一个事务时,会隐式提交上一个事务。

         2)当前的autocommit系统变量的值为OFF时,我们手动把它调为ON时,也会隐式提交前边语句所属的事务

        3)使用lock tables,unlock tables等关于锁定的语句也会隐式提交前边语句所在的事务。

(4)加载数据的语句

使用load data 语句批量向数据库中导入数据时,会隐式提交前边的语句所在的事务。 

(5)关于MySQL复制的一些语句

使用state slave,stop slave,reset slave,change master to等语句时会隐式提交前边语句的所属的事务。

五、事务分类

1、扁平事务

是事务中最简单的一种,但是在实际生成环境中,这可能是使用最频繁的事务,在扁平事务中,所有操作都处于同一层次,由begin开始,commit或者rollback结束,期间的操作是原子的,要么都执行,要么都回滚。因此,扁平事务是应用程序成为原子操作的基本组成模块。每个数据库系统都实现了对扁平事务的支持。

扁平事务一般有三种不同的结果

(1)事务成功完成

在应用程序中占所有事务的96%

(2)应用程序要求停止事务

比如应用程序捕获到异常时回滚事务,约占所有事务的3%

(3)外界因素强制终止事务

连接超时,或者连接断开,约占所有事务的1%

带有保存点的扁平事务

除了支持扁平事务的操作外,还允许在事务执行过程中回滚到同一事务中较早的一个状态,这是因为某些事务可能在执行过程中出现的错误并不会导致所有的操作都无效,放弃整个事务开销太大。

保存点

用来通知事务系统应该记住事务当前的状态,以便当发生错误时,事务能回到保存点当时的状态。对于扁平事务来说,隐式的设置了一个保存点,在这个事务中,只有一个保存点,因此回滚只能回滚到事务的开始时的状态。

2、链式事务

一个事务由多个子事务链式组成,它可以被视为保存点模式的一个变种。带有保存点的扁平事务,当发生系统奔溃时,所有的保存点都消失,这意味着当进行恢复时,事务需要从开始重新执行,而不能从最近的一个保存点继续执行。

链式事务的思想是,在提交一个事务时,释放不需要的数据对象,将必要的处理上下文隐式的传给下一个要开始的事务,前一个子事务的提交操作和下一个子事务的开始操作合并成一个原子操作。这意味着下一个事务将看到上一个事务的结果,就好像在一个事务里进行一样。这样在提交事务时就可以释放不需要的数据对象,而不必等到整个事务完成后才释放。

 链式事务与带保存点的扁平事务的不同之处

(1)带有保存点的扁平事务能回滚到任意正确的保存点,而链式事务中的回滚仅限于当前事务,即只能恢复到最近的一个保存点。

(2)对于锁的处理,两者也不相同,链式事务在执行commit后释放了当前所持有的锁,而带有保存点的扁平事务不影响迄今为止所持有的锁。

3、嵌套事务

由一个顶层事务,控制着各个层次的事务,顶层事务之下嵌套的事务被称为子事务,其控制着每一个局部的变换,子事务本身也可以嵌套事务。嵌套事务的层次结构可以看成一颗树。

4、分布式事务

在分布式环境下运行的扁平事务,因此需要根据所在的位置访问网络中不同节点的数据库资源。

六、案例

1、completion_type

completion_type为mysql中的一个参数,有3中情况

(1)completion=0

此时是默认情况,当执行commit的时候会提交事务,在执行下一个事务时,还需要使用START TRANSACTION 或者  BEGIN开启新的事务

(2)completion=1

当提交事务后,相当于执行了commit and chain,也就是开启了一个链式事务,即当我们提交事务之后会开启一个相同隔离级别的事务

(3)completion=2

此时commit等价于commit and release,也就是当提交后,会自动与服务器断开连接。

、、

举报

相关推荐

0 条评论