草庐IT

最简短最直白的解释:脏读、不可重复读、幻读,以及四种隔离级别的含义

羽飞落 2023-03-28 原文

导读

一条事务由、开始事务、执行事务(增删改查操作)、提交事务或回滚,三个步骤组成。

 

级别:读未提交

其他事务修改字段后 - 提交事务前,此期间,当前事务能读到,该字段修改后未提交的值 ,所以叫读未提交,由此会产生脏读问题。

 

问题:脏读

1.A字段 值为 1

2.事务A 修改 A字段 为 2

3.事务B 读取 A字段 得到 2

4.事务A 回滚 A字段 恢复为 1

5.事务B 再取 A字段 得到 1

案例中 事务BA字段 两次的值不一样,原因是被 事务A 的回滚污染了,所以叫脏读。

 

级别:读已提交

此级别下,当前事务不会查询到,其他事务修改未提交的值,所以叫读已提交,由此解决脏读问题,但还存在不可重复读问题。

 

问题:不可重复读

1.A字段 值为 1

2.事务B 修改 A字段 为 2 提交

3.事务A 读取 A字段 得到 2

4.事务C 修改 A字段 为 1 提交

5.事务A 再取 A字段 得到 1

案例中 事务A 读 A字段 两次的值不一样,原因是过程中 事务B、事务C 修改了值,

事务A 重复读同一字段,得到的值不同,所以叫不可重复读。

 

级别:可重复读

此级别下,当前事务重复读某字段,结果相同,不受其他事务修改影响,所以叫可重复读,由此解决不可重复读问题,但还存在幻读问题。

 

问题:幻读

1.A表5 条数据

2.事务A 读取 A表 得到 5 条数据

3.事务BA表 插入 1 条数据 并提交

4.事务A 再读 A表 得到 6 条数据

案例中 事务AA表 两次得到的数据条数不一样,原因是过程中 事务B 插入了新数据,

因为受到其他事务增删行为影响,当前事务的同一条SQL语句两次查询的记录数不一样,就叫幻读。

 

级别:串行化

此级别能解决以上所有问题。

有关最简短最直白的解释:脏读、不可重复读、幻读,以及四种隔离级别的含义的更多相关文章

  1. ruby - 使用 RubyZip 生成 ZIP 文件时设置压缩级别 - 2

    我有一个Ruby程序,它使用rubyzip压缩XML文件的目录树。gem。我的问题是文件开始变得很重,我想提高压缩级别,因为压缩时间不是问题。我在rubyzipdocumentation中找不到一种为创建的ZIP文件指定压缩级别的方法。有人知道如何更改此设置吗?是否有另一个允许指定压缩级别的Ruby库? 最佳答案 这是我通过查看ruby​​zip内部创建的代码。level=Zlib::BEST_COMPRESSIONZip::ZipOutputStream.open(zip_file)do|zip|Dir.glob("**/*")d

  2. ruby - 什么是填充的 Base64 编码字符串以及如何在 ruby​​ 中生成它们? - 2

    我正在使用的第三方API的文档状态:"[O]urAPIonlyacceptspaddedBase64encodedstrings."什么是“填充的Base64编码字符串”以及如何在Ruby中生成它们。下面的代码是我第一次尝试创建转换为Base64的JSON格式数据。xa=Base64.encode64(a.to_json) 最佳答案 他们说的padding其实就是Base64本身的一部分。它是末尾的“=”和“==”。Base64将3个字节的数据包编码为4个编码字符。所以如果你的输入数据有长度n和n%3=1=>"=="末尾用于填充n%

  3. 【鸿蒙应用开发系列】- 获取系统设备信息以及版本API兼容调用方式 - 2

    在应用开发中,有时候我们需要获取系统的设备信息,用于数据上报和行为分析。那在鸿蒙系统中,我们应该怎么去获取设备的系统信息呢,比如说获取手机的系统版本号、手机的制造商、手机型号等数据。1、获取方式这里分为两种情况,一种是设备信息的获取,一种是系统信息的获取。1.1、获取设备信息获取设备信息,鸿蒙的SDK包为我们提供了DeviceInfo类,通过该类的一些静态方法,可以获取设备信息,DeviceInfo类的包路径为:ohos.system.DeviceInfo.具体的方法如下:ModifierandTypeMethodDescriptionstatic StringgetAbiList​()Obt

  4. 阿里云国际版免费试用:如何注册以及注意事项 - 2

    作为新的阿里云用户,您可以50免费试用多种优惠,价值高达1,700美元(或8,500美元)。这将让您了解和体验阿里云平台上提供的一系列产品和服务。如果您以个人身份注册免费试用,您将获得价值1,700美元的优惠。但是,如果您是注册公司,您可以选择企业免费试用,提交基本信息通过企业实名注册验证,即可开始价值$8,500的免费试用!本教程介绍了如何设置您的帐户并使用您的免费试用版。​关于免费试用在我们开始此试用之前,您还必须遵守以下条款和条件才能访问您的免费试用:只有在一年内创建的账户才有资格获得阿里云免费试用。通过此免费试用优惠,用户可以免费试用免费试用活动页面上列出的每种产品一次。如果您有多个帐

  5. ruby-on-rails - faraday如何设置日志级别 - 2

    我最近将我的http客户端切换到faraday,一切都按预期工作。我有以下代码来创建连接:@connection=Faraday.new(:url=>base_url)do|faraday|faraday.useCustim::Middlewarefaraday.request:url_encoded#form-encodePOSTparamsfaraday.request:jsonfaraday.response:json,:content_type=>/\bjson$/faraday.response:loggerfaraday.adapterFaraday.default_ada

  6. ruby - ruby 中的同一个程序如何接受来自用户的输入以及命令行参数 - 2

    我的ruby​​脚本从命令行参数获取某些输入。它检查是否缺少任何命令行参数,然后提示用户输入。但是我无法使用gets从用户那里获得输入。示例代码:test.rbname=""ARGV.eachdo|a|ifa.include?('-n')name=aputs"Argument:#{a}"endendifname==""puts"entername:"name=getsputsnameend运行脚本:rubytest.rbraghav-k错误结果:test.rb:6:in`gets':Nosuchfileordirectory-raghav-k(Errno::ENOENT)fromtes

  7. ruby -\b 在 Ruby 正则表达式中的真正含义是什么? - 2

    我有一个文件,其中包含诸如“CanyonSt/27thWay”之类的短语,我正试图使用​​Ruby正则表达式将其转换为“CanyonStand27thWay”。我使用file=file.gsub(/(\b)\/(\b)/,"#{$1}and#{$2}")进行匹配,但我我对\b的真正含义以及为什么$1包含斜线之前的单词边界之前的所有字符以及为什么$2包含从下一个单词开始的单词边界之后的所有字符感到有点困惑。通常,我希望正则表达式括号中的任何内容都在$1和$2中,但我不确定单词边界周围的括号真正意味着什么,因为从单词字符到字符的转换之间确实没有任何内容一个空白字符。

  8. ruby - 如何更改 Sinatra 中的日志级别 - 2

    我正在使用此代码在我的Sinatra应用程序中启用日志记录:log_file=File.new('my_log_file.log',"a")$stdout.reopen(log_file)$stderr.reopen(log_file)$stdout.sync=true$stderr.sync=true实际的日志记录是使用:logger.debug("Startingcall.Params=#{params.inspect}")事实证明,只有INFO或更高级别的日志消息被记录,而DEBUG消息没有被记录。我正在寻找一种将日志级别设置为DEBUG的方法。 最佳

  9. ruby - 使用 include 的简短 Ruby Case 语句?不管用 - 2

    我有以下代码,其中有一个小错误,case语句返回值“other”,即使第一个“when”语句评估为true并且应该返回“boats”。我已经关注这个很久了,一定是个小东西。CATEGORY_CLASSES={:boats=>[1,2,3,4,5,6],:houses=>[7,8,9,10],:other=>[11,12,13,14,15,16]}category_id=1category=casecategory_idwhenCATEGORY_CLASSES[:boats].include?(category_id);"boats"whenCATEGORY_CLASSES[:house

  10. ruby - 堆栈级别太深(SystemStackError) - 2

    我有Sinatra应用程序,需要测试我的应用程序。features/support/env.rb:require_relative"../../application"require"capybara"require"capybara/cucumber"require"rspec"WorlddoCapybara.app=ApplicationincludeCapybara::DSLincludeRSpec::Matchersendfeatures/one.feature:Feature:TesthomepageInordertomakesurepeoplecanopenmysiteIw

随机推荐