一文读懂事务-MySQL 事务的属性 事务的并发 事务的隔离

事务的概念

对于事务,首先要明确的一个问题是:什么是事务?通俗地讲就是把对数据库地一系列操作看作一个不可分隔的整体,它只能全部完成或者全部失败,这是事务的特性之一:原子性。
下面先看看一张思维导图对事务有个大概的了解
在这里插入图片描述

事务的特性

首先我们先明确事务的四大特性,也叫ACID特性。它是我们理解事务并发的问题和事务隔离级别的前提。
在这里插入图片描述

  • A:Atomicity:原子性。是指事务是一个完整的整体,要不全做要不全不做,不存在中间状态。
  • C: Consistency:一致性。是指事务的执行不能破坏数据库的完整性和一致性,事务执行前后数据库都必须处于一致性的状态。
  • I:Isolatio:隔离性。是指在并发环境中,事务之间是互相隔离的。操作同一数据的时候,每个事务都有自己的数据空间。并发事务是不能互相干扰的。隔离性有四个级别。
  • D: Duration:持久性。是指事务一旦被提交,数据库中的数据必须被永久保存。就算服务器宕机也可以通过数据恢复回到原来的状态。

事务的隔离级别与并发时遇到的问题

在这里插入图片描述
在这里插入图片描述

读未提交隔离级别
该隔离级别最低,会导致脏读,不可重复读和幻读。该隔离级别并发效率高,但是数据容易发生错误。

  • 脏读,即A事务读取了B事务回滚前的数据,假设数据库并发执行张三借50块给李四的事务,时间线如下:
    在这里插入图片描述
    可以看出事务执行前后数据并不一致,出现了错误。
    可能这时候你会想,那我让事务A提交后才可以让B事务读取,不就可以限制脏读了吗?所以我们到了下一个隔离级别:
    读已提交隔离级别
    该隔离级别可以限制脏读,但还是会产生不可重复读和幻读。
    在这里插入图片描述
    可以看出,A事务只能读取提交后数据,不再读取‘脏’数据。但是此刻又产生一个问题,A事务只是做了两次查询,但是查询结果却不一样!很明显,B事务影响到了A事务的执行,违反了事务ACID特性中的隔离性。所以又提出了另一个隔离级别:

可重复读隔离级别
该隔离级别会保证一个事务在读取一个数据时不会因为别的事务提交而改变。
在这里插入图片描述
如图所示,即使B事务提交了减少张三余额的语句,事务A仍然只会看到数据与它第一次读取的一样,这就是可重复读。只有当事务A提交后,当前窗口才能看到张三余额的变化。此时,你是不是觉得该隔离级别已经可以完美解决所有问题呢?并非如此-------->它以依然会导致幻读,请看诡异的更新事
件:

在这里插入图片描述
事务A在T2和T4查询的结果是一致的,但是当事务A进行范围修改后,再查询数据,会发现数据多了一条记录。这就是幻读。要限制幻读的话就要来到事务隔离的最高级别:

顺序读隔离级别
顺序读要求所有的事务排队顺序执⾏,即事务只能⼀个接⼀个地处理,不
能并发。

事务的语法

基本事务操作

  1. start transaction;/ begin;开始事务
  2. commit; 确认
  3. rollback; 回滚
--设置事务的隔离级别

-- 查看当前会话的隔离级别
select @@tx_isolation;

-- 读未提交
set session transaction isolation level read uncommitted;

-- 读已提交 READ_COMMITTED
set session transaction isolation level read committed;


-- 可重复读 REPEATABLE_READ
set session transaction isolation level repeatable read;


-- 顺序读 SERIALIZABLE
set session transaction isolation level SERIALIZABLE;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值