MySQL事务,这篇文章就够了

原文连接: https://blog.ouyangsihai.cn/ >> MySQL事务,这篇文章就够了

在看这篇文章以前,咱们回顾一下前面的几篇关于MySQL的系列文章,应该对你读下面的文章有所帮助。html

0 什么是事务

事务(Transaction) 是并发控制的基本单位。所谓的事务,它是一个操做序列,这些操做要么都 执行,要么都不执行,它是一个不可分割的工做单位。事务是数据库维护数据一致性的单位,在每 个事务结束时,都能保持数据一致性。java

同时,事务有着严格的地定义,必须知足四个特性,也就是咱们一直说的ACID,可是,并非说各类数据库就必定会知足四个特性,对于不一样的数据库的实现来讲,在不一样程度上是不必定彻底知足要求的,好比,Oracle数据库来讲,默认的事务隔离级别是READ COMMITTED,是不知足隔离性的要求的。mysql

下面咱们趁热打铁,介绍一下事务的必知必会的四大特性,这几个特性也是在面试中,面试官面试MySQL的相关知识的时候,问的比较多的问题,因此,这几个特性务必须要理解而且透彻的记在内心,开个玩笑,被火车撞了,也不该该忘记这四个特性!面试

1 事务的四大特性

事务的四大特性简称为:ACID,分别是原子性、一致性、隔离性和持久性sql

下面咱们一一来介绍一下。数据库

  • 原子性(Atomicity)

原子性指的是整个数据库的事务是一个不可分割的工做单位,每个都应该是一个原子操做。微信

当咱们执行一个事务的时候,若是一系列的操做中,有一个操做失败了,那么,须要将这一个事务中的全部操做恢复到执行事务以前的状态,这就是事务的原子性。网络

下面举个简单的例子。并发

i++;

上面这个最简单不过的代码常常也会被问到,这是一个原子操做吗?那确定不是,若是咱们把这个代码放到一个事务中来讲,当i+1出现问题的时候,回滚的就是整个代码i++(i = i + 1)了,因此回滚以后,i的值也是不会改变的。分布式

以上就是原子性的概念。

  • 一致性(consistency)

一致性是指事务将数据库从一种状态转变为下一种一致性的状态,也就是说在事务执行先后,这两种状态应该是同样的,也就是数据库的完整性约束不会被破坏。

另外,须要注意的是一致性是不关注中间状态的,好比银行转帐的过程,你转帐给别人,至于中间的状态,你少了500 ,他多了500,这些中间状态不关注,若是分屡次转帐中间状态也是不可见的,只有最后的成功或者失败的状态是可见的。

若是到分布式的一致性问题,又能够分为强一致性、弱一致性和最终一致性,关于这些概念,能够本身查查,仍是颇有意思的。

  • 隔离性(isolation)

事务咱们是能够开启不少的,MySQL数据库中能够同时启动不少的事务,可是,事务和事务之间他们是相互分离的,也就是互不影响的,这就是事务的隔离性

  • 持久性(durability)

事务的持久性是指事务一旦提交,就是永久的了,就是发生问题,数据库也是能够恢复的。所以,持久性保证事务的高可靠性。

2 事务的分类

事务能够分为不少中类型,通常分为:扁平事务、带有保存点的扁平事务、链事务、嵌套事务、分布式事务

扁平事务

扁平事务是最简单的一种,在实际开发中也是使用的最多的一种事务。在这种事务中,全部操做都处于同一层次,最多见的方式以下:

BEGIN WORK
Operation 1
Operation 2
Operation 3
...
Operation N
COMMIT WORK

举个例子

begin work;

select * from user;

update user set name = 'sihai' where id = 1;

commit work;

扁平事务的主要缺点是不能提交或回滚事务的某一部分,或者分几个独立的步骤去提交。

带有保存点的扁平事务

这种事务除了支持扁平事务支持的操做外,这种事务跟扁平事务最大的区别就是容许在事务执行过程当中回滚到同一事务中较早的一个状态,这是由于可能某些事务在执行过程当中出现的错误并不会对全部的操做都无效,放弃整个事务不合乎要求,开销也太大。保存点用来通知系统应该记住事务当前的状态,以便之后发生错误时,事务能回到该状态。

举个例子

begin work;

select * from user;

savepoint t1;

update user set name = 'sihai' where id = 1;

savepoint t2;

commit work;

经过上面的方式咱们就创建了两个保存点t一、t2,经过ROLLBACK TO SAVEPOINT t1,咱们就能够返回到保存点t1

链事务

链事务:在提交一个事务时,释放不须要的数据对象,将必要的处理上下文隐式的传给下一个要开始的事务。须要注意,提交事务操做和下一个事务操做将合并为一个原子操做,就是下一个事务能够看到上一个事务的结果。

链事务,就是指回滚时,只能恢复到最近一个保存点;而带有保存点的扁平事务则能够回滚到任意正确的保存点。

举个例子

begin work;

select * from user;

savepoint t1;

update user set name = 'sihai' where id = 1;

savepoint t2;

commit work;

仍是这个例子,可是对于链事务来讲,是不能直接rollback到保存点t1的,最能恢复到最近的一个保存点t2;另外咱们须要注意,链事务在执行commit后就会释放当前事务所持有的全部锁,而带有保存点的扁平事务不会影响所持有的锁。

嵌套事务

在事务中再嵌套事务,这种结构有点像一颗横着的树的结构,位于根节点的事务称为顶层事务。事务的前驱称为父事务,其它事务称为子事务。事务的前驱称为父事务,事务的下一层称为子事务。

子事务既能够提交也能够回滚,可是它的提交操做并不立刻生效,除非由其父事务提交。所以就能够肯定,任何子事务都在顶层事务提交后才真正的被提交了。同理,任意一个事务的回滚都会引发它的全部子事务一同回滚。

BEGIN WORK
     SubTransaction1:
             BEGIN WORK
                 SubOperationX
             COMMIT WORK
     SubTransaction2:
             BEGIN WORK
                 SubOperationY
             COMMIT WORK
     ...
     SubTransactionN:
             BEGIN WORK
                 SubOperationN
             COMMIT WORK
COMMIT WORK

分布式事务

分布式事务一般是指在一个分布式环境下运行的扁平事务,所以须要根据数据所在位置访问网络中的不一样节点。

在不一样的物理地址,经过网络访问,执行不一样的事务,这就是分布式事务。

3 事务的使用

首先这一部分咱们仍是先介绍一下这些事务的语句,也不是不少,使用也不复杂,下面用一个表格作一个整理。

注意COMMITCOMMIT WORK语句不一样之处在于COMMIT WORK用来控制事务结束后的行为是 CHAIN仍是 RELEASE,若是是CHAIN,那么事务就是 链事务

用户能够经过参数completion_type控制,以下:

  • completion_type = 1 实例

执行下面的操做;

SET @@completion_type = 1;

BEGIN WORK;

INSERT INTO lock_test SELECT 10;

COMMIT WORK;

接着咱们再执行下面的操做;

INSERT INTO lock_test SELECT 115;

ROLLBACK;

 SELECT * FROM lock_test;

咱们先插入一条数据115,而后再回滚,咱们知道若是不是在一个事务的时候,115应该是会插入成功的,就算咱们回滚了,可是,这里咱们回滚以后,查询结果以下:

这个时候并无115这条记录,也就是回滚生效了,说明在COMMIT WORK以后,又是一个新的事务,因此才会出现这样的结果。

  • completion_type = 2 实例

咱们先进行下面的操做;

SET @@completion_type = 2;

BEGIN WORK;

INSERT INTO lock_test SELECT 5;

COMMIT WORK;

上面咱们已经提交事务了,当咱们使用下面的语句查询lock_test的数据的时候,就会出现断开链接

SELECT * FROM lock_test;

4 事务的隔离级别

事务的隔离级别有四种分别是:

  • READ UNCOMMITTED
  • READ COMMITTED
  • REPEATABLE READ
  • SERIALIZABLE

对于这几种隔离级别会带来的问题及总结,能够查看这篇文章:MySQL的又一神器-锁,MySQL面试必备

5 总结

这篇文章从下面几个内容介绍了一下MySQL数据库事务的内容,更详细的其余内容在后面的文章中再讲解。

  • 概念
  • 事务类型
  • 事务使用
  • 事务的隔离级别
文章有不当之处,欢迎指正,若是喜欢微信阅读,你也能够关注个人 微信公众号好好学java,获取优质学习资源。
相关文章
相关标签/搜索