【笔记】事务隔离级别以及MVCC解决幻读

2024-06-24 05:20

本文主要是介绍【笔记】事务隔离级别以及MVCC解决幻读,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

事务提交可能碰到的问题:
(1)脏读:事务1对数据进行修改但还没提交,事务2读取修改后的数据,之后事务1执行错误,回滚了,此时事务2的数据是错误的脏数据
(2)不可重复读:事务1读取数据1后,事务2对数据1进行修改,之后事务1的再次读取数据1时,发现前后读取结果不一致
(3)幻读:事务1根据条件查询到一批数据后,事务2删除或增加或修改了某些数据,之后事务1再次根据条件查询,发现读取的数据数量不对了

事务隔离级别:数据库中事务之间的隔离程度
数据库提供了四种事务隔离级别:

  • 读未提交(RU, Read Uncommitted):指一个事务还没提交时,它做的变更就能被其他事务看到;
  • 读已提交(RC, Read Committed):指一个事务提交之后,它做的变更才能被其他事务看到,解决了脏读
  • 可重复读(RR, Repeatable Read):指一个事务执行过程中看到的数据,一直跟这个事务启动时看到的数据是一致的,解决了脏读和不可重复读.(MySQL InnoDB 引擎的默认隔离级别)
  • 串行化(Serializable ):对记录加上读写锁

在这里插入图片描述
从上到下,控制程度越来越高,并发处理能力越来越低,但安全性更高
RU:啥问题都有,一般不用
Serializable: 加锁,解决全部问题,不用操心,就是并发处理能力比较低
在RC级别下如何解决不可重复读和幻读?
方法:用MVCC解决,但无法完全避免幻读
MVCC(多版本并发控制):数据库中同时存在多个版本的数据,一个版本是一张快照(ReadView文件),它们通过版本链连接,版本链的头节点代表当前记录的最新值。
这样,在一个事务中,如果需要读取数据,就可以直接读取版本链中适合自己的版本,从而实现非锁定读取,解决了不可重复读问题,也一定程度上减少了幻读的发生。
在RR级别下如何解决幻读?
方法:MVCC+间隙锁
间隙锁是一种锁定记录之间 间隙的锁,间隙锁和行锁合称 next-key lock, 每个next-key lock是前开后闭的区间.(比如间隙锁(0,5)+行锁[5]的锁定区间是(0,5]) ,初始化插入6 个记录会产生 7 个间隙,如下图所示:
在这里插入图片描述
不仅给事务加了行锁,还给行前后的间隙加了间隙锁,当另一个事务尝试在一个已经被锁定的间隙插入新的记录时,会被阻塞,从而避免了幻读问题。
当前读和快照读
快照读:读取数据时获取某一时刻的快照,普通的select查询语句是快照读
当前读:读取最新的数据,就是执行下列语句时进行数据读取的方式
insert、Update、Delete、Select…for update(写锁)、Select…lock in share mode(读锁)

RC级别时MVCC在每一次select时都重新生成快照数据,快照数据依据版本数据链条的头部最新数据产生。
RR级别时只在第一次读取数据时生成一个ReadView,后面会复用第一次生成的。

这篇关于【笔记】事务隔离级别以及MVCC解决幻读的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1089276

相关文章

Tolua使用笔记(上)

目录   1.准备工作 2.运行例子 01.HelloWorld:在C#中,创建和销毁Lua虚拟机 和 简单调用。 02.ScriptsFromFile:在C#中,对一个lua文件的执行调用 03.CallLuaFunction:在C#中,对lua函数的操作 04.AccessingLuaVariables:在C#中,对lua变量的操作 05.LuaCoroutine:在Lua中,

AssetBundle学习笔记

AssetBundle是unity自定义的资源格式,通过调用引擎的资源打包接口对资源进行打包成.assetbundle格式的资源包。本文介绍了AssetBundle的生成,使用,加载,卸载以及Unity资源更新的一个基本步骤。 目录 1.定义: 2.AssetBundle的生成: 1)设置AssetBundle包的属性——通过编辑器界面 补充:分组策略 2)调用引擎接口API

2024.6.24 IDEA中文乱码问题(服务器 控制台 TOMcat)实测已解决

1.问题产生原因: 1.文件编码不一致:如果文件的编码方式与IDEA设置的编码方式不一致,就会产生乱码。确保文件和IDEA使用相同的编码,通常是UTF-8。2.IDEA设置问题:检查IDEA的全局编码设置和项目编码设置是否正确。3.终端或控制台编码问题:如果你在终端或控制台看到乱码,可能是终端的编码设置问题。确保终端使用的是支持你的文件的编码方式。 2.解决方案: 1.File -> S

《offer来了》第二章学习笔记

1.集合 Java四种集合:List、Queue、Set和Map 1.1.List:可重复 有序的Collection ArrayList: 基于数组实现,增删慢,查询快,线程不安全 Vector: 基于数组实现,增删慢,查询快,线程安全 LinkedList: 基于双向链实现,增删快,查询慢,线程不安全 1.2.Queue:队列 ArrayBlockingQueue:

vue同页面多路由懒加载-及可能存在问题的解决方式

先上图,再解释 图一是多路由页面,图二是路由文件。从图一可以看出每个router-view对应的name都不一样。从图二可以看出层路由对应的组件加载方式要跟图一中的name相对应,并且图二的路由层在跟图一对应的页面中要加上components层,多一个s结尾,里面的的方法名就是图一路由的name值,里面还可以照样用懒加载的方式。 页面上其他的路由在路由文件中也跟图二是一样的写法。 附送可能存在

vue+elementui分页输入框回车与页面中@keyup.enter事件冲突解决

解决这个问题的思路只要判断事件源是哪个就好。el分页的回车触发事件是在按下时,抬起并不会再触发。而keyup.enter事件是在抬起时触发。 so,找不到分页的回车事件那就拿keyup.enter事件搞事情。只要判断这个抬起事件的$event中的锚点样式判断不等于分页特有的样式就可以了 @keyup.enter="allKeyup($event)" //页面上的//js中allKeyup(e

vue+elementui--$message提示框被dialog遮罩层挡住问题解决

最近碰到一个先执行this.$message提示内容,然后接着弹出dialog带遮罩层弹框。那么问题来了,message提示框会默认被dialog遮罩层挡住,现在就是要解决这个问题。 由于都是弹框,问题肯定是出在z-index比重问题。由于用$message方式是写在js中而不是写在html中所以不是很好直接去改样式。 不过好在message组件中提供了customClass 属性,我们可以利用

操作系统实训复习笔记(1)

目录 Linux vi/vim编辑器(简单) (1)vi/vim基本用法。 (2)vi/vim基础操作。 进程基础操作(简单) (1)fork()函数。 写文件系统函数(中等) ​编辑 (1)C语言读取文件。 (2)C语言写入文件。 1、write()函数。  读文件系统函数(简单) (1)read()函数。 作者本人的操作系统实训复习笔记 Linux

Spring中事务的传播机制

一、前言 首先事务传播机制解决了什么问题 Spring 事务传播机制是包含多个事务的方法在相互调用时,事务是如何在这些方法间传播的。 事务的传播级别有 7 个,支持当前事务的:REQUIRED、SUPPORTS、MANDATORY; 不支持当前事务的:REQUIRES_NEW、NOT_SUPPORTED、NEVER,以及嵌套事务 NESTED,其中 REQUIRED 是默认的事务传播级别。

LVGL快速入门笔记

目录 一、基础知识 1. 基础对象(lv_obj) 2. 基础对象的大小(size) 3. 基础对象的位置(position) 3.1 直接设置方式 3.2 参照父对象对齐 3.3 获取位置 4. 基础对象的盒子模型(border-box) 5. 基础对象的样式(styles) 5.1 样式的状态和部分 5.1.1 对象可以处于以下状态States的组合: 5.1.2 对象