加入收藏 | 设为首页 | 会员中心 | 我要投稿 常州站长网 (https://www.0519zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MySql教程 > 正文

MySQL事务,这篇文章就够了

发布时间:2019-11-04 16:44:09 所属栏目:MySql教程 来源:欧阳思海
导读:副标题#e# 0 什么是事务 事务(Transaction) 是并发控制的基本单位。所谓的事务,它是一个操作序列,这些操作要么都 执行,要么都不执行,它是一个不可分割的工作单位。事务是数据库维护数据一致性的单位,在每 个事务结束时,都能保持数据一致性。 同时,
副标题[/!--empirenews.page--]

MySQL事务,这篇文章就够了

0 什么是事务

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

同时,事务有着严格的地定义,必须满足四个特性,也就是我们一直说的ACID,但是,并不是说各种数据库就一定会满足四个特性,对于不同的数据库的实现来说,在不同程度上是不一定完全满足要求的,比如,Oracle数据库来说,默认的事务隔离级别是READ COMMITTED,是不满足隔离性的要求的。

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

1 事务的四大特性

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

下面我们一一来介绍一下。

  •  原子性(Atomicity)

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

当我们执行一个事务的时候,如果一系列的操作中,有一个操作失败了,那么,需要将这一个事务中的所有操作恢复到执行事务之前的状态,这就是事务的原子性。

下面举个简单的例子。

  1. i++; 

上面这个最简单不过的代码经常也会被问到,这是一个原子操作吗?那肯定不是,如果我们把这个代码放到一个事务中来说,当i+1出现问题的时候,回滚的就是整个代码i++(i = i + 1)了,所以回滚之后,i的值也是不会改变的。

以上就是原子性的概念。

  •  一致性(consistency)

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

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

如果到分布式的一致性问题,又可以分为强一致性、弱一致性和最终一致性,关于这些概念,可以自己查查,还是很有意思的。

  •  隔离性(isolation)

事务我们是可以开启很多的,MySQL数据库中可以同时启动很多的事务,但是,事务和事务之间他们是相互分离的,也就是互不影响的,这就是事务的隔离性。

  •  持久性(durability)

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

2 事务的分类

事务可以分为很多中类型,一般分为:扁平事务、带有保存点的扁平事务、链事务、嵌套事务、分布式事务。

扁平事务

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

  1. BEGIN WORK  
  2. Operation 1  
  3. Operation 2  
  4. Operation 3  
  5. ...  
  6. Operation N  
  7. COMMIT WORK 

举个例子

  1. begin work;  
  2. select * from user;  
  3. update user set name = 'sihai' where id = 1;  
  4. commit work; 

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

带有保存点的扁平事务

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

举个例子

  1. begin work;  
  2. select * from user;  
  3. savepoint t1;  
  4. update user set name = 'sihai' where id = 1;  
  5. savepoint t2;  
  6. commit work; 

通过上面的方式我们就建立了两个保存点t1、t2,通过ROLLBACK TO SAVEPOINT t1,我们就可以返回到保存点t1。

链事务

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

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

MySQL事务,这篇文章就够了

举个例子

  1. begin work;  
  2. select * from user;  
  3. savepoint t1;  
  4. update user set name = 'sihai' where id = 1;  
  5. savepoint t2;  
  6. commit work; 

(编辑:常州站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读