• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

关于msyql事务隔离你要知道

mysql 搞代码 4年前 (2022-01-09) 18次浏览 已收录 0个评论

什么是事务?

事务是数据库管理系统执行过程中的一个逻辑单位,由一个有限的数据库操作序列构成。数据库事务通常包含了一个序列的对数据库的读/写操作。包含有以下两个目的:

  1. 为数据库操作序列提供了一个从失败中恢复到正常状态的方法,同时提供了数据库即使在异常状态下仍能保持一致性的方法。
  2. 当多个应用程序在并发访问数据库时,可以在这些应用程序之间提供一个隔离方法,以防止彼此的操作互相干扰。

隔离性与隔离级别

提到事务,你肯定会想到ACID(Atomicity、Consistency、Isolation、Durability,即原子性、一致性、隔离性、持久性),今 天我们就来说说其中I,也就是“隔离性”。当数据库上有多个事务同时执行的时候,就可能出现脏读(dirty read)、不可重复读(non-repeatable read)、幻读 (phantom read)的问题,为了解决这些问题,就有了“隔离级别”的概念。隔离级别做的越强则性能就越不好,所以要在性能与隔离级别中取一个平衡点。SQL标准的事务隔离级别包括:

  • 读未提交(read uncommitted):一个事务提交之后,它做的变更才会被其他事务看到。会产生脏读。
  • 读已提交(read committed):一个事务提交之后,它做的变更才会被其他事务看到。会产生不可重复读。
  • 可重复读(repeatable read) :一个事务执行过程中看到的数据,总是跟这个事务在启动时看到的数据是一致的。当然在可重复读隔离级 别下,未提交变更对其他事务也是不可⻅的。会产生幻读。
  • 串行化(serializable ):顾名思义是对于同一行记录,“写”会加“写锁”,“读”会加“读锁”。当出现读写锁冲突的来&源gao@dai!ma.com搞$代^码%网时候,后访问的事务必须等前 一个事务执行完成,才能继续执行。
隔离级别 脏读 不可重复读 幻读
读未提交 可以出现 可以出现 可以出现
读提交 不允许出现 可以出现 可以出现
可重复读 不允许出现 不允许出现 可以出现
序列化 不允许出现 不允许出现 不允许出现

主要是读已提交和可重复读比较难区分,所以我们看个小例子。先创建一张表,并插入数据1

create database test;
use test;
create table test(id int primary key);
insert into test(id) values(1);
事务A 事务B
启动事务查询得到1 启动事务
查询得到1
将1改为2
查询得到V1
提交事务B
查询得到V2
提交事务A
查询得到V3

我们来看看在不同的隔离级别下,事务A会有哪些不同的返回结果,也就是图里面V1、V2、V3的返回值分别是什么。

  • 若隔离级别是“读未提交”, 则V1的值就是2。这时候事务B虽然还没有提交,但是结果已经被A看到了。因此,V2、V3也都 是2。
  • 若隔离级别是“读提交”,则V1是1,V2的值是2。事务B的更新在提交后才能被A看到。所以, V3的值也是2。
  • 若隔离级别是“可重复读”,则V1、V2是1,V3是2。之所以V2还是1,遵循的就是这个要求:事务在执行期间看到的数据前 后必须是一致的。
  • 若隔离级别是“串行化”,则在事务B执行“将1改成2”的时候,会被锁住。直到事务A提交后,事务B才可以继续执行。所以从 A的⻆度看, V1、V2值是1,V3的值是2。

搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:关于msyql事务隔离你要知道
喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址