数据库-事务


前言

事务就是要保证一组数据库操作,要么全部成功,要么全部失败。有点原子操作的意思。另外提一嘴,MySQL中,InnoDB引擎是支持事务的,但是MyISAM引擎是不支持事务的,这也是MySQL中使用InnoDB引擎比较多的一个重要原因。


零、从SQL走进事务

SELECT * from user;    //显示user表数据信息
START TRANSACTION;     //开始事务
DELETE FROM user;      //删除user表
SELECT FROM user;      //此时显示数据信息为空
ROLLBACK;              //回滚到事务开始的地方
SELECT FROM user;      //显示user信息表,和开始事务之前的查询结果相同

事务就是一组数据库操作,可以把他们想成一个整体的部分。一般select没有必要回滚,插入、更改、删除数据可以回滚。但是create、drop不可以回滚。另外,也可以在事务之间设置保留点

SAVEPOINT delete1;
ROLLBACK to delete1;  //可以回滚到指定位置。

一、事务的特点-ACID?

  • 原子性(Atomicity):就是事务中的数据库操作要么全部执行,要么全部执行失败。
  • 一致性(Consistency):在经过一个事务之后,数据前后的一致性保持一致。
  • 隔离性(Isolation):描述事务与事务之间的关系,一个事务在另外一个或者多个事务内的权限,例如事务A可不可以访问事务B中的字段。
  • 持久性(Durability):事务提交之后,数据就可以持久到数据库了。

二、多个事务引发的问题

  • 脏读:就是一个事务可以读取另外一个事务中还没有提交的字段值。
  • 不可重复读:在一个事务内,多次执行查询,发现两次查询数据不相同。
  • 幻读:事务A在进行删除、新增记录,这些记录在同时进行的事务B也涉及。这样事务B就像产生了幻觉一样,怎么多了/少了记录。
  • 不可重复的 vs 幻读:不可重复读针对的是单个事务内,出现的情况大多是修改。而幻读是事务之间的行为,导致出现增减/减少记录的现象,出现在增加或者删除情况。

三、解决事务之间并发的问题-隔离级别

定义事务之间的访问权限,有效的保护事务中的数据安全。

1、读未提交

  • 是最低级的隔离级别,即最不严格的隔离,也就是最不安全的。其意思是:事务A能够读取事务B中没有提交的字段值。
  • 因此读未提交的隔离级别是会出现脏读、不可重复读、幻读的问题的。

2、读提交

  • 规定要在事务B提交之后,事务A才可以访问事务B中的数据。
  • 读提交的隔离级别是能够解决脏读的问题,但是还是不能解决不可重复读、幻读问题。

3、可重复读

  • 事务在执行期间可以保证数据是可重复读。事务A在没有提交之前,重复执行相同的查询,得到的结果是相同的。
  • 可以解决幻读、不可重复读问题。

4、串行化

  • 串行化是最高的隔离级别,完全符合事务的ACID特性,事务依次逐个的执行,事务之间没有干扰。
  • 可以解决脏读、不可重复读、幻读问题。
  • 但是其效率不高,一般不使用。

注释:MySQL默认的隔离级别是可重复读,Oracle默认的隔离级别是读提交。

5、举例

这里使用MySQL实战45讲的一张图片,解释上述隔离级别。

分别看一下不同的隔离界别下,事务A会有哪些不同的返回结果。V1=?V2=?V3=?

  • 读未提交:V1 = V2 = V3 = 2,V1等于2的原因是在事务B没有commit之前,事务A就可以读取事务B中已经更改的值了,因此V1=2。
  • 读提交:V1 = 1,V2 = 2,V3 = 2;事务B提交之后,事务A才可以看到。
  • 可重复读:V1 = V2 = 1,V3 = 2,在事务A执行期间,也就是事务A提交之前,不可以更改值,等到事务A提交之后,V3 = 2.
  • 串行化:V1 = V2 = 1,V3 = 2;事务B执行1变成2时,会被锁住,直到事务A提交之后,事务B才可以执行。

四、事务实现原理

在数据库中会创建一个视图,访问是按照视图的逻辑结果来进行的。当执行失败,事务可以进行回滚到上一个版本,即数据库会给同一个记录存在多个版本,这就是数据库的多版本并发控制(MVCC)。当系统中没有比这个回滚日志更早的视图,会被删除。

  • 读未提交隔离级别下时没有视图概念的,直接返回记录上的最新值。
  • 读提交隔离级别下,视图时在每个SQL语句开始执行的时候创建的。
  • 可重复读的隔离级别下,视图时在事务启动的时候创建的,整个事务期间都存在这个视图。
  • 串行化的隔离级别下,是直接在修改字段值的事务加锁来避免并行访问。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值