数据库村的旺财和小强

cockroach小强DB安装与TPCC测试 概述 小强DB是一款分布式数据库,类似TiDB,基于postgresql协议,底层是LevelDB。 本文记录其集群安装、使用和测试过程。 安装 安装很简单,一个包:https://www.cockroachlabs.com/docs/v21.1/install-cockroachdb-linux#download-the-binary curl https://binaries.cockroachdb.com/cockroach-v21.1.11.linux-amd64.tgz | tar -xz &am 阅读详情

丢失的数据

旺财是数据库村的一个程序, 小强也是。

数据库村有个特点, 很多数据支持共享操作,多个程序可以同时读写,他们俩经常会为了读写同一个数据, 争夺的不可开交。

这一天,当旺财和小强对同一个银行账户A进行写操作时候, 出现了这么一个错误:

0?wx_fmt=png

看看, 本来旺财要加上的20元就丢掉了。  

同样的事情发生的多了, 他俩给这种情况起了一个名字,叫“丢失修改”, 其实说白了就是俩人都去写一个数据, 一个人的数据把另外一个给覆盖了。

村里的Mysql说: “你们两个小家伙,写数据的时候连加锁都不做,肯定会出大乱子!"

旺财说:“加什么锁?”

“来来来, 我教你们一个排他锁(Exclusive Lock) ,   简称X锁, 旺财你要写数据了, 就把它用X锁锁住, 锁住后,除非你释放, 否则小强无法获得X锁。 这不就解决你们的问题了?  ”

小强想了想, 就把上面的操作过程用X锁改了一下:

0?wx_fmt=png

旺财说:“果然不错, 确实可以解决两个人同时修改导致的问题。”

脏数据

小强说:“旺财, 我们约定,写数据的时候都用X锁吧?”

旺财说: “这没问题, 可是X锁只在写数据的时候用, 我们读数据是不用加锁的, 我想起了一种情况, 你看看怎么办?”

0?wx_fmt=png

小强在旺财执行的途中读了A的值, 但是旺财把对A的修改给回滚(Rollback)了, 这下小强尴尬了, 他读到了脏数据。

“要不我们在读取数据的时候也加个X锁 ? ” 小强说。

“那样太严格了, 就是读一个数据啊, 值得吗?”

“这样吧, 我们再搞一个新的锁出来, 专门用于共享数据的读取, 就叫共享锁(Share lock) ,简称S锁, 这个锁和之前的排他锁X锁有区别, 主要用于读取数据,  如果一个数据加了X锁, 就没法加S锁, 同样加了S锁, 就没法加X锁”   小强想出了一个点子。

“那如果我加了S锁, 你还能加S锁吗? ”  旺财问。

“应该可以吧,  咱们俩都是读数据, 互不影响啊。 还有为了防止长时间的锁住, 我们可以约定一下,不管我们要做的事情有多少, 读一个数据之前加S锁, 读完之后立刻释放该S锁 ! ”

0?wx_fmt=png

果然,这样一来“脏数据”的问题就解决了 !

没法重复读?

旺财和小强两个程序相安无事了很久, 但是S锁在读完数据后立刻释放的约定, 导致出了一个新问题。

旺财在一次数据处理中, 先读取了A和B的值, 相加得到了150 ,  然后小强把B改成了30

旺财再次读取A和B, 发现求和以后是130 , 刚才的不一样了!

(码农翻身注: 假定旺财的处理是在一个事务当中)

0?wx_fmt=png

旺财说: “小强,  我在读取数据的时候你不能改啊 , 要不然我这里会出现不一致, 你看刚开始是A+B是 150, 现在变成130了”

小强说: “我们之前的约定是读数据时加S锁, 读完立马释放,  问题就出现在这里了。”

“看来在读数据的时候, 也需要一直锁定了, 直到事务提交。”

0?wx_fmt=png

幻觉出现

旺财和小强现在已经能灵活的使用X锁和S锁了。

他们俩总结了一下, 分为了这么几种情况:

1.  写数据时加上X锁,直到事务结束, 读的时候不加锁。

虽然能够避免丢失数据,  但是可以读到没有提交或者回滚的内容 (脏数据), 这其实就是数据库最低的事务隔离级别 --- Read uncommitted


2. 写数据的时候加上X锁, 直到事务结束,  读的时候加上S锁, 读完数据立刻释放。

这能避免“丢失数据”和“脏数据”,  但是会出现“不可重复读”的问题  ,  这是第二级的事务隔离级别 -- Read committed


3.  写数据的时候加上X锁,  直到事务结束, 读数据的时候加S锁, 也是直到事务结束。

这能避免“丢失数据”和“脏数据”, “不可重复读”三个问题 , 这是数据库常用的隔离级别 --

Repeatable read


整个世界似乎清净了。

有一次旺财对一个“学生表”进行操作,选取了年龄是18岁的所有行, 用X锁锁住, 并且做了修改。

改完以后旺财再次选择所有年龄是18岁的行, 想做一个确认, 没想到有一行竟然没有修改!

这是怎么回事?  出了幻觉吗?

原来就在旺财查询并修改的的时候,  小强也对学生表进行操作, 他插入了一个新的行,其中的年龄也是18岁!  虽然两个人的修改都没有问题, 互不影响, 但从最终效果看, 还是出了事。

(码农翻身注: 正是小强的操作, 让旺财出现了“幻读”)

旺财说: “没辙了, 我们俩非得串行执行不可, 你必须得等我执行完。 ”

这就是数据库事务隔离级别的终极大招:Serializable


最后, 为了方便记忆, 他们俩倒腾了半天, 整出了一张表, 用于记录各种情况:

0?wx_fmt=jpeg

(点击看大图)

两个人看着这张表, 感慨的说:“唉, 这数据库村的事务隔离级别可真是不容易啊!”

Mysql 不屑一顾的说: “这都嫌麻烦了, 你们还没遇到死锁呢....”

你看到的只是冰山一角, 更多精彩文章,尽在“码农翻身” 微信公众号, 回复消息"m"或"目录" 查看更多文章

有心得想和大家分享? 欢迎投稿 ! 我的联系方式:微信:liuxinlehan  QQ: 3340792577

0?wx_fmt=jpeg

公众号:码农翻身

“码农翻身”公众号由工作15年的前IBM架构师创建,分享编程和职场的经验教训。

华为云企业级Redis第17期:集群搭载多DB,多租隔离更降本 GaussDB(for Redis)支持真正可扩展的多DB,轻松实现降本增效 阅读详情

相关推荐

是德频谱分析仪相位噪声测量实战指南:从原理到精准操作

本文详细介绍了是德频谱分析仪在相位噪声测量中的实战操作指南,从基础概念到高级技巧全面解析。通过5G基站时钟测量等实际案例,展示如何利用是德N9030B等设备精准测量相位噪声,并分享设备预热、参数设置、环境干扰排除等关键操作要点,帮助工程师提升测量精度和效率。

jenkins8butler的博客 229

数据库村的旺财和小强 MVCC

这是一篇超级干的干货,尤其是MVCC部分,很烧脑,挑战一下吧。1丢失的数据旺财是数据库村的一个程序, 小强也是。数据库村有个特点, 很多数据支持共享操作,多个程序可以同时读写,他们俩经常会为了读写同一个数据, 争夺的不可开交。这一天,当旺财和小强对同一个银行账户A进行写操作时候, 出现了这么一个错误:看看, 本来旺财要加上的20元就丢掉了。  同样的事情发生的多了, 他俩给这种情况起了一个名字,叫...

卖克的专栏 2691

SQL Server 2025在Windows 11上的安装避坑指南

SQL Server 是微软主流关系型数据库管理系统,其安装与Windows操作系统深度耦合;Windows 11作为新一代桌面平台,强化了基于虚拟化的安全(HVCI)、驱动签名强制策略(WDAC)及内核隔离机制,导致传统数据库部署流程失效。理解二者底层交互原理,是解决服务启动失败、配置管理器无法打开、远程连接被拒等高频问题的技术前提。本文聚焦SQL Server 2025与Windows 11的兼容性挑战,覆盖系统预配置、安装节点诊断、防火墙与服务权限调优等工程实践环节,适用于高校教学、电赛备赛、中小企业

weixin_28741413的博客 319

旺财和小强的三生三世

第一世旺财和小强是线程池的两个线程, 他们经常做的工作就是对一个数加加减减,用人类的话来说就是存款,取款。publicclassAccount{ private...

码农翻身 475

Time-Interleaved Analog-to-Digital Converters

  这篇论文提供了时间交错模数转换器的教程回顾。在解释了偏置、增益、定时和其他不匹配对变换器性能的影响后,给出了目前解决不匹配问题的方法。论文最后总结了时间交错模数转换器的现状。 1.简介   时间交错模数转换器(ADC)将多个子ADC组合成一个ADC系统,可以实现比单独的子ADC[1]更快的采样速率。历史上,时间交错adc的主要缺点是需要紧密匹配子adc[2]的特性。近年来,由于应用需要非常宽带信号的数字化、功率高效子adc的可用性以及由深亚微米互补金属氧化物硅(CMOS)技术实现的微调技术,使得时间交错

weixin_44537056的博客 6732

Mplus实战:三变量随机截距交叉滞后模型(RI-CLPM)语法详解与扩展

本文详细解析了Mplus中三变量随机截距交叉滞后模型(RI-CLPM)的构建原理与语法实现。通过将变量分解为稳定的个体间差异与动态的个体内波动,模型能更纯净地揭示多变量间的纵向交互影响。文章以工作压力、睡眠质量与工作满意度为例,提供了完整的语法模板、关键参数设置(如NOCOV命令、残差相关)及结果解读指南,帮助研究者避开常见误区,稳健分析复杂动态关系。

wdx0123456的博客 927

全国最新各省、市、县、镇、村数据库,详细到村的数据

全国最新各省、市、县、镇、村数据库 下载包中包含以下内容: 《最新全国各省、市、县、镇、村数据库说明.txt》操作说明 《2014最新全国街道乡镇级以上行政区划代码表.xls》EXCEL表数据 《mysqlDB(全国各省、市、县、镇、村数).sql》MYSQL数据有131MB

datedateup的专栏 5万+

Type-C转DP1.4转C双向互传转接线方案

Type-C转DP双向互转方案的核心在于利用Type-C接口中的Alt Mode(交替模式)功能。通过利用Type-C接口的Alt Mode功能,该方案实现了Type-C接口与DP接口之间的双向互传,极大地丰富了用户的视觉体验。在选择Type-C转DP双向互转方案时,用户需要关注兼容性、性能需求、线缆长度和品牌等因素,以确保获得最佳的传输质量和使用体验。因此,Type-C转DP双向互转方案应运而生,旨在实现Type-C接口与DP接口之间的无缝连接,满足用户对高效能和高清晰度视频传输的需求。

m0_70875024的博客 4976

小白科普:悲观锁和乐观锁

转自:码农翻身(微信号:coderising)1、无锁旺财和小强生活在一个网上商城的系统中, 是一对儿线程好基友。星期一刚上班,旺财接到领导电话说,要把一个商品的库存减少20, 旺财不敢怠慢,赶快把库存取出来一看,哦,现在有1000个。与此同时,小强也接到电话说要把同一商品的库存减少30, 他一看,哦,现在有1000个。旺财计算出最新的库存值980, 保存!小强也计算出最新的库存值970...

baixing2023的博客 126

如何解决Elsevier和IEEE期刊之间参考文献的转换问题

Elsevier期刊和IEEE旗下的期刊两者模版互相转换的时候,会发现Elsevier模版的参考文献是存放在.bib文件下的,然后在.tex文件中直接引用即可。3. 在IEEE的.tex文件中的\end{document}命令行之前,添加下面的这句话(ps:\bibliography{**}中的**名称即为.bib文件的名称)如何将Elsevier的参考文献快速的转成IEEE期刊可用的格式,是本博客需要解决的问题。2. 将下载好的.bib文件,上传到IEEE的latex文件中。

薰珞婷紫小亭子的博客 1675

基于深度学习 YOLOv11 的快递包裹检测系统(Python + PySide6 界面 + 训练代码)

成为亟需优化的重要环节。随着电子商务的快速发展,物流行业面临着越来越大的压力,为了解决这些问题,我们提出了一种。目标检测算法,实现快递包裹的。的界面,供用户进行实时监控。本项目的主要目标是利用。

斌擎科技 762

小强的HTML5移动开发之路(20)——HTML5 Web SQL Database

一、Web Database介绍 WebSQL数据库API实际上不是HTML5规范的组成部分,而是单独的规范。它通过一套API来操纵客户端的数据库。Safari、Chrome、Firefox、Opera等主流浏览器都已经支持WebSQL Database WebSQL数据库有三个核心方法: 1)打开数据库openDatabase()方法: 此方法创建数据库对象,既可

水寒 5464

PyTorch 面试题及参考答案(精选100道)

模块是 PyTorch 中用于自动求导的核心模块。它为张量上的所有操作提供了自动求导的功能。在深度学习中,反向传播是一种用于计算损失函数相对于模型参数的梯度的算法。通过梯度,我们可以使用优化算法(如随机梯度下降)来更新模型的参数,从而最小化损失函数。模块的主要作用就是自动计算这些梯度。当我们创建一个张量时,如果将其属性设置为True,那么 PyTorch 会跟踪该张量上的所有操作。在完成前向传播计算出损失函数后,调用方法,模块会自动根据链式法则反向传播计算出所有需要求导的张量的梯度。

大模型大数据攻城狮的专栏 1681

MVCC多版本控制

1. 丢失的数据 旺财是数据库村的一个程序, 小强也是。 数据库村有个特点, 很多数据支持共享操作,多个程序可以同时读写,他们俩经常会为了读写同一个数据, 争夺的不可开交。 这一天,当旺财和小强对同一个银行账户A进行写操作时候, 出现了这么一个错误:   看看, 本来旺财要加上的20元就丢掉了。   同样的事情发生的多了, 他俩给这种情况起了一个名字,叫“丢失修改”, 其实说白了就...

freedom_824的博客 3353

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

数据仓库基本理论

1、关系模式范式 1.1 范式理论概述 关系型数据库设计时,遵照一定的规范要求,目的在于降低数据的冗余性和数据的一致性,目前业界范式有:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、巴斯-科德范式(BCNF)、第四范式(4NF)、第五范式(5NF)。 范式的标准定义是:符合某一种级别的关系模式的集合,表示一个关系内部各属性之间的联系的合理化程度。通俗地讲,范式可以理解为一张数据表的...

Moody的博客 5306

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

高考小强源码阅读

读别人的代码像破解密码一样,乐趣无穷。 高考小强是一个基于Python2的、关于高考志愿填报的问答系统,它收集了往年的各个学校、各个专业的分数信息,可以根据省份、分数、文理推荐合适的学校。 一、五大板块 CollegeRecommendation 学校、专业推荐模块,通过SQL查询数据库获得推荐的学校列表、专业列表 DialogueManagement 对话管理模块,将格式化数据转化为具体的句子...

weixin_34375251的博客 662

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

为什么要建数据仓库,而不是直连数据源?

各位数据的朋友,大家好,我是老周道数据,和你一起,用常人思维+数据分析,通过数据讲故事。 今天和大家聊一个话题:为什么BI软件要用构建数据仓库,而不是直连数据源的方式开发报表?) 在与企业IT的交流过程中,经常会讨论到一个话题,就是做BI数据可视化分析报表时,是建数据仓库好,还是直连数据源好。这个话题,在很多年前非常普遍,近几年少了许多,但仍然会有一些客户会问:“奥威BI软件支持在同一个报表中访问不同的数据源吗?” 可以肯定地回答,奥威BI软件在技术上是支持的。但是,我们强烈反对使用这种方式来开发报表,我们

qq_43696218的博客 1540

数据库丢失,脏读,重复读,幻读,MVCC

1.丢失的数据 旺财是数据库村的一个程序,小强也是。 数据库村有个特点,很多数据支持共享操作,多个程序可以同时读写,他们俩经常会为了读写同一个数据,争夺的不可开交。 这一天,当旺财和小强对同一个银行账户A进行写操作时候, 出现了这么一个错误: 看看, 本来旺财要加上的20元就丢掉了。 同样的事情发生的多了, 他俩给这种情况起了一个名字,叫“丢失修改”, 其实说白了就是俩人都去写...

Pushkin.的博客 441

数据仓库-拉链表

拉链表拉链表是针对数据仓库设计中表存储数据的方式而定义的,顾名思义,所谓拉链,就是记录历史。记录一个事物从开始,一直到当前状态的所有变化的信息。我们先看一个示例,这就是一张拉链表,存储的是用户的最基本信息以及每条记录的生命周期。我们可以使用这张表拿到最新的当天的最新数据以及之前的历史数据。

wangqiaowq的博客 2149

华为云企业级Redis:集群搭载多DB,多租隔离更降本

GaussDB(for Redis)支持真正可扩展的多DB,轻松实现降本增效。

华为云官方博客 1629

小强的HTML5移动开发之路(48)——(小练习)新闻订阅系统【1】

一、总体设计二、数据库设计 --新闻类别表 create table news_cate( news_cateid int primary key auto_increment, news_iconurl varchar(50), news_catname varchar(5), news_cat

水寒 6090

数据库的四大特性以及四个隔离级别和引发的问题

四大特性(ACID) 1.原子性(Atomicity)   原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚。失败回滚的操作事务,将不能对事务有任何影响。 2. 一致性(Consistency)   一致性是指事务必须使数据库从一个一致性状态变换到另一个一致性状态,也就是说一个事务执行之前和执行之后都必须处于一致性状态。   例如:A和B进行转账操作,A有200块钱,B有300...

weixin_30871701的博客 166
上一篇: 张大胖学数据库
下一篇: JDBC的诞生
码农翻身
码农翻身 《码农翻身》作者 《码农翻身》作者
博客等级 码龄8年 3万+粉丝 1084原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值