mysql隔离级别和mvcc_数据库MVCC和隔离级别的关系是什么?

谢邀。

首先我要指出问题中提出的各种概念非常混乱。简单梳理下:

早期数据库不论读取还是写入,都用锁来实现。但是锁会带来性能的问题。人们尝试各种优化方案。写入和读取的优化方式不同。

对于数据库写入操作,没有特别好的办法,因为无论如何要避免并发修改一个数据,就得靠锁。不同的数据库对于写入操作都会加悲观锁(比如MySQL是X锁)。为了避免X锁带来的性能问题,人们在合适的场合会选择用乐观锁来优化。有的数据库内建乐观锁,但是有的没有(比如MySQL就没有),所以需要开发人员自己在数据表里加version列,自己写业务代码实现。顺便提一句,乐观锁并不一定总是比悲观锁性能表现更好,这要看竞争的程度。如果数据访问竞争的非常厉害,乐观锁只会让CPU和IO白白浪费而已。

对于读取,优化就是MVCC。现在主流的商业数据库都是基于MVCC,如MySQL InnoDB和Postgres。MVCC的意思用简单的话讲就是对数据库的任何修改的提交都不会直接覆盖之前的数据,而是产生一个新的版本与老版本共存,使得读取时可以完全不加锁。这样读某一个数据时,事务可以根据隔离级别选择要读取哪个版本的数据。过程中完全不需要加锁。

这样,实现两个隔离级别就非常容易:Read Committed - 一个事务读取数据时总是读这个数据最近一次被commit的版本

Repeatable Read - 一个事务读取数据时总是读取当前事务开始之前最后一次被commit的版本(所以底层实现时需要比较当前事务和数据被commit的版本号)。

举个简单的例子:一个事务A(txnId=100)修改了数据X,使得X=1,并且commit了

另外一个事务B(txnId=101)开始尝试读取X,但是还X=1。但B没有提交。

第三个事务C(txnId=102)修改了数据X,使得X=2。并且提交了

事务B又一次读取了X。这时如果事务B是Read Committed。那么就读取X的最新commit的版本,也就是X=2

如果事务B是Repeatable Read。那么读取的就是当前事务(txnId=101)之前X的最新版本,也就是X被txnId=100提交的版本,即X=1。

注意,这里B不论是Read Committed,还是Repeatable Read,都不会被锁,都能立刻拿到结果。这也就是MVCC存在的意义。

在基于MVCC的数据库实现中,根本就不需要出现Read Uncommitted这种情况。Read Uncommitted是早期数据库,读写都基于锁进行实现的产物。在实际业务中Read Uncommitted毫无意义(如果真有意义,你咋不去用NoSQL数据库?)因此:对于Postgres,Read Committed和Read Uncommitted是一样的。

对于Oracle,压根就没有Read Uncommitted这个级别。

所以从实际的角度出发,我想所有人都忘记有“Read Uncommitted”这件事。

MVCC并不是万灵药。大量的业务问题的关键点在于,你在提交一个事务那一刹那,你提交事务的所有修改依赖的读取是否都还有效。对于这种场景,无论是Read Committed还是Repeatable Read都没有什么卵用。比如扣库存就是这样典型的业务场景。

在这种场景下在MySQL InnoDB,使用者会使用select ... for update手工加锁。或者干脆用Serializable隔离级别。

在Postgres,Postgres的Repeatable Read在提交时会提供一个“提交的修改的依赖是否被修改“的检测(好绕口,但就是这个意思)。如果依赖已经被改掉了,当前事务提交一定会失败。

希望上面的简单回答可以让你重新对数据库、锁和隔离级别有所认识。如果没看懂也不奇怪,问题本身的确非常复杂,所以我专门写了一篇很长的文字来解释这个问题,希望可以帮到你。

数据库事务、隔离级别和锁​www.jianshu.com

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/563350.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java 模拟平台_用Java程序模拟登陆网站平台

由于想测试性能,想模拟多个用户同时登陆系统进行访问,于是写了一个例子。代码如下:URL url null;HttpURLConnection httpurlconnection null;try {url new URL("http://www.****.com");httpurlconnection (HttpURLConnection) …

服务器raid1重装系统,做软RAID1 重装系统后数据会丢失吗

匿名用户1级2017-04-04 回答如何使用windows 2003做软RAID (0,1,5) | 浏览:3388 | 更新:2014-01-03 19:17 | 标签:windowsRAID是一种磁盘容错技术,由两块以上的硬盘构成冗余,当某一块硬盘出现物理损坏时,换一块同型号的…

java前端开发_Java前端开发学习什么内容

Java是一门高级编程语言,现在java工程师需求很大,所以java的前景很好,有些朋友往java前端开发方向发展,那么,Java前端开发学习什么内容呢?动力节点java学院小编来告诉你。就目前市场行情来看,Java最流行的…

用友t3显示无法解析服务器名称,用友T3软件进入用友通提示不能解析端口,不能登录服务器...

用友软件增加明细科目时提示新增会计科目是,提示上级科目已经使用,新增科目将自动改为上级科目的设置已经使用的科目如何增加明细科目在软件操作过程中,经常会遇到对已经使用的科目,要求增加其明细科目的问题。科目已经使用&#…

java idle 机制_HotSpot VM重量级锁降级机制的实现原理

HotSpot VM内置锁的同步机制简述:HotSpot VM采用三中不同的方式实现了对象监视器——Object Monitor,并且可以在这三种实现方式中自动切换。偏向锁通过在Java对象的对象头markOop中install一个JavaThread指针的方式实现了这个Java对象对此Java线程的偏向…

java 类 解析_Java集合类解析 ***

collection集合Map集合Hashtable和HashMap的区别:Hashtable的方法是同步的,而HashMap的方法不是。HashMap可以将空值作为一个表的条目的key或value。Collection接口Collection接口是List、Set和Queue接口的父接口,该接口里定义的方法既可用于…

JVM的生命周期

1.加载(Loading): 在加载阶段,JVM会找到并加载Java字节码文件。加载阶段分为三个步骤:通过类的全限定名找到对应的字节码文件,创建一个与该类相关的Class对象,将类的静态数据结构存储在方法区中…

java数组数据结构_Java数据结构之数组

自定义数组(面向对象编程):直接上代码:package com.xingej.algorithm.datastructure.array;/*** 面向对象编程** 自定义类数组** 你一定要明白,这是在JDK基础之上的封装,要学会这种思路,其他框架如netty 也是在前者的基…

java项目如何单元测试_大家java web项目开发做单元测试吗?

java web项目测试用Web的测试工具,如HtmlUnit,JWebUnit等。main()方法就可以测试,在main方法中获得connection对象将他输出就可以了。如果正常输出一大串就是对了。例子:public class DBConnection {private static String url &…

python双素数_python双素数_用Python打印100以下的所有双素数对

^{bq}$这是一种基于筛分的方法,它有点短,速度快得多:def find_prime_pairs(n):sieve [True] * nif n > 0:sieve[0] Falseif n > 1:sieve[1] Falsefor number in range(2, int(n ** 0.5) 1):if sieve[number]:for index in range(nu…

python无所不能_python-列表

列表创建:# 方式一:(常用)s [1, 2, 小超银]print(s) # [1, 2, 小超银]# 方式二:(不常用)s1 list() # 空列表l1 list(123)print(l1) # [1, 2, 3]# 方式三:列表推导式l1 [i for i in range(1,5)]print(l1) # [1, 2, 3, 4]增&…

lvds接口屏线安装图解_五分钟让你学会液晶拼接屏安装方法

液晶拼接屏成为目前比较热门的大屏显示系统,技术比较成熟,清晰度高、维护方便,性价比也还不错,市场需求量较大。但是液晶拼接屏安装方法很多人并不了解,下面小编就来简单介绍一下。以46寸液晶拼接屏指导安装为例&#…

cmd255command.executereader()打印连接错误_打印经常遇到的几个问题,轻松解决

在平常的工作中,我们经常会遇到一些打印问题,今天就分享下几个常见的故障问题解决。wps/office文档一点击打印就卡死这种一般默认打印机设置的是其它电脑共享的情况下出现的,当与主机的连接出现异常或者主机的打印设置有问题时,就…

如何制定客户留存策略_商客通:办理石家庄400电话如何留存客户

【办理石家庄400电话如何留存客户】在如今理性消费的市场,400电话能够为在消费者心中为企业营造一份信任感,彰显企业关怀及企业责任感;为消费者提供畅达的通信渠道、完善的企业服务保障。石家庄400电话搬家不换号石家庄企业在公司搬迁或者员工…

普中51控制火焰传感器_汽车爆震传感器的工作原理及的检测方法、处理

汽车爆震传感器的工作原理及的检测方法、处理黄永刚1 爆震传感器的工作原理按照结构的不同,可以将汽车爆震传感器分为压电式非共振型爆震传感器、压电式共振型爆震传感器和压电式火花塞座金属垫型爆震传感器,又可以分为压电式爆震传感器和电感式爆震传感…

idb 怎么回复mysql_MysqliDb 库的一些使用简单技巧(php)

一.分页功能假设接口要接受输入:page, page_limit,key,value,table 来查询 table 中 key like value 的元组中以 page_limit 为 page size 时第 page 页的数据。要求输出为:{"count" > $count&#xff0c…

java绘制流程图_如何才能更好地绘制计算机毕业设计中各种图表

“ 毕设论文中的各种图表是不可或缺的,如果只是单纯的文字,或者图表较少,达不到要求的话,最终是通过不了答辩审核的!”目前绘制图表的软件很多,比如VISIO等,切记尽量不要使用word软件进行绘制&a…

arcgis加载dwg显示一个点_Arcgis添加控制点配准校正影像,更新校正之后,其他软件打开之后,影像位置没有校正解决办法...

使用有偏移的两景影像srcImg.tif 和 refImg.tif举例,用refImg.tif为参考,把待校正影像srcImg.tif,与refImg.tif配准一致。原始影像如下所示:这里就不演示如何采集控制点了,大家可以搜索arcgis配准详细步骤;…

网页检测不到java无法打印_如果PC连接到网络打印机,如何检查java?

根据“How Network Printing Works”,它实际上取决于打印机的类型和它支持的协议.如果您知道打印机使用的IP和端口,并且您的打印机支持SNMP(仅选择协议),则可以使用SNMP协议1查询打印机以获取信息. Java libSNMP4j可以帮助您实现这一目标.我建议不要使用它,除非打印机,IP和端口…

空投坐标怎么看6_嗦粉不咯?桂林米粉店将分三四五星级,你怎么看? 旅行 6 月 4 日热点速递...

吃货们请听好,以下内容可能与你有关~来看今日好问广西无疑是嗦粉星人的圣地,桂林米粉、柳州螺蛳粉、南宁老友粉 ...... 用手指都不够数。这不,桂林发布「米粉新政」,从 7 月起桂林米粉店划分为三星级、四星级、五星级三个等级。如…