资讯专栏INFORMATION COLUMN

三言两语RR与RC那点事

IT那活儿 / 2256人阅读
三言两语RR与RC那点事

点击上方“IT那活儿”公众号,关注后了解更多内容,不管IT什么活儿,干就完了!!!


01


从事数据库开发和运维的人员或多或少都了解过关于《可重复读和读提交》这2种隔离级别,今天我们就来研究一下。


02


一般来说事务存在4大特性ACID(原子性、一致性、隔离性、持久性),这里我们主要来说一下隔离性。
当多个事务并发执行时,数据库为了保证事务之间的隔离性便引入了隔离级别的概念。SQL标准将事务隔离级别分为读未提交(read uncinnutted),读已提交(read committed/RC),可重复度(repeatable read/RR),串行化(serializable)。
如下:

表格中读未提交与串行化比较简单,也不常用。目前主流数据库采用的主要是读已提交和可重复度。
我们举个例子来描述一下:
2种模式下T3时刻分别获取到了不同的值。
分别来看一下,在T3时刻,可重复读级别下,虽然T2时刻其他事务已提交变更,但是事务任然以启动时间T1为准,也就是查询结果需要与T1保持一致,即T2事务属于未来事务,不可见。而在读已提交级别下以当前语句时刻为准,对于T3时刻而言,T2时刻属于已提交事务,即可获取T2时刻已提交的变更。
这里我们可以发现2种隔离级别主要区别在于事务起点时刻的划分,也可以称为数据库快照(简单理解就是数据库某一时刻的全局事务状态)的划分。
对于数据库任意时刻的快照而言总是存在如下3种情况:
  • 对于快照n而言未提交的事务总是不可见。

  • 快照n之后,其他事务x做的提交,这里包含快照n之前启动在n之后完成提交的事务也包含快照n之后新启动完成提交的事务,对于快照n而言在其之后提交的事务都属于未来事务,同样不可见。

  • 快照之前已完成提交的事务才可见。

也就是说对于可重复读级别而言快照以事务开始时间为准,读已提交级别下每条SQL语句启动时重新获取当前数据库的快照以便获取最新已提交的事务情况。


03


这里可能有些同学会有疑问,在RR级别下,T3时刻将T减1是不是意味着T2时刻的事务变更会丢失?
如下:
针对这个问题,数据库引擎当然没有那么小白,这里适用一条新的规则, 发生DML时,需要读取已提交事务的最新值,这个读一般称为"当前读"(current read)。
案例中也就是T3发起set DML时需要获取已提交的最新值也就是T=2后,再进行运算,这就不存在事务丢失的风险了,需要注意如果事务n进行了修改但是没有提交,这里事务1就会产生行锁等待,这里我们就不再展开介绍了。

04


最后来总结一下这2种隔离级别的适用场景:
4.1 RC:适用于CRM类查询相对较多,需要获取最新值类系统。
查询与修改7:1,8:1等等,注意具体参考实际系统,并不绝对。
4.2 RR:适用于对账类系统,比如信用卡账户表与信用卡消费明细表。
采取RC隔离级别时,如果不将数据静止化,对账的事务周期内,账户表余额或明细表一直发生变更,那整个账本永远也无法对账一致。
另外比如mysqldump之类的逻辑备份,使用--single-transaction时自动设置会话事务为RR,其不仅仅是备份出数据,同样需要保证数据与数据之间的逻辑一致性。

END



本文作者:胡 杰

本文来源:IT那活儿(上海新炬王翦团队)

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/129486.html

相关文章

  • 容器化管理平台存储点事

    摘要:机器配置主机名地址说明存储节点存储节点测试挂载的机器格式化和挂载磁盘主要目的就是将磁盘格式化为,作为的底层存储文件系统个节点都需要执行注意这个示例是以作为数据磁盘。 以 Docker 为代表的容器技术在云计算领域正扮演着越来越重要的角色,甚至一度被认为是虚拟化技术的替代品。企业级的容器应用常常需要将重要的数据持久化,方便在不同容器间共享。为了能够持久化数据以及共享容器间的数据,Dock...

    xcold 评论0 收藏0
  • 关于localStorage面试的点事

    摘要:已经超出本地存储限定大小可进行超出限定大小之后的操作,如下面可以先清除记录,再次保存面试官一波素质三连对于只是会使用的同学来说,肯定是不得其解的。 最近面试的时候关于html5API总会被问到localStorage的问题, 对于一般的问题很简单,无非就是 localStorage、sessionStorage和cookie这三个客户端缓存的区别 localStorage的API,g...

    timger 评论0 收藏0
  • 关于性能优化的点事——函数节流

    摘要:函数节流背景中的函数大多数情况下都是由用户主动调用触发的除非是函数本身的实现不合理否则一般不会遇到跟性能相关的问题但在少数情况下函数的触发不是由用户直接控制的在这些场景下函数可能被非常频繁调用而造成大的性能问题场景事件事件滚动事件共同的特征 函数节流 背景 javascript中的函数大多数情况下都是由用户主动调用触发的, 除非是函数本身的实现不合理, 否则一般不会遇到跟性能相关的问题...

    khlbat 评论0 收藏0
  • js函数点事

    摘要:在种函数实际上是对象,每个函数都是类型的实例。也就是说一个函数可能会有多个名字。这就是我们平时所说的函数声明提升。函数的内部属性包括具体不再叙述了函数的属性和方法函数有个属性,和表示函数希望接收命名参数的个数。 要知道,在js中,引用类型是一种数据结构,包含5种引用类型,分别是Object,data,Array,re请输入代码gExp,Function。今天我们就说Function这种...

    nanchen2251 评论0 收藏0
  • 移动端键盘和光标的兼容点事

    摘要:解决方法如果使用页面数据不超过一屏禁止滚动,那么即使变成了页面也不会有什么变化。 作者:@micky思 @wupq @yewq 在H5的开发中,个人的制作页面布局习性不同,多多少少会产生在真机上input的光标和键盘的弹出会出现的各种BUG,文中整理了部分遇到的问题,欢迎新增 ios移动端输入框上浮导致输入位置偏移 问题原因:遮罩层定位为fixed,当键盘弹起时,ios11以及以下...

    XboxYan 评论0 收藏0
  • 移动端键盘和光标的兼容点事

    摘要:解决方法如果使用页面数据不超过一屏禁止滚动,那么即使变成了页面也不会有什么变化。 作者:@micky思 @wupq @yewq 在H5的开发中,个人的制作页面布局习性不同,多多少少会产生在真机上input的光标和键盘的弹出会出现的各种BUG,文中整理了部分遇到的问题,欢迎新增 ios移动端输入框上浮导致输入位置偏移 问题原因:遮罩层定位为fixed,当键盘弹起时,ios11以及以下...

    Kerr1Gan 评论0 收藏0

发表评论

0条评论

IT那活儿

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<