脏读、不可重复读、幻读

没写完就读产生脏读(写操作加锁读操作不加锁产生脏读)synchronized-多线程与高并发 模拟银行账户,对业务写方法加锁,对业务读方法不加锁,这样有什么后果? 因为这种情况不能保证写操作完成后再进行读操作,没写完就读容易读到不准确的中间态数据,即产生脏读。 /** * 模拟银行账户 * 对业务写方法加锁 * 对业务读方法不加锁 * 这样行不行? * * 容易产生脏读问题(dirtyRead) */ package main.java.basic._synchronized; import java.util.concurrent.TimeUnit; pu... 阅读详情

锁就是防止其他事务访问指定的资源的手段。锁是实现并发控制的主要方法,是多个用户能够同时操纵同一个数据库中的数据而不发生数据不一致现象的重要保障。 一般来说,锁可以防止脏读、不可重复读和幻觉读。

 

事务并发产生的问题:
        脏读:一个事务读取到了另外一个事务没有提交的数据
            事务1:更新一条数据
                             ------------->事务2:读取事务1更新的记录
            事务1:调用commit进行提交
           
            ***此时事务2读取到的数据是保存在数据库内存中的数据,称为脏读。
            ***读到的数据为脏数据
            详细解释:
                脏读就是指:当一个事务正在访问数据,并且对数据进行了修改,而这种修改还没有提交到数据库中,这时,
                另外一个事务也访问这个数据,然后使用了这个数据。因为这个数据是还没有提交的数据,那么另外一个
                事务读到的这个数据是脏数据,依据脏数据所做的操作可能是不正确的。
           
        不可重复读:在同一事务中,两次读取同一数据,得到内容不同
            事务1:查询一条记录
                            -------------->事务2:更新事务1查询的记录
                            -------------->事务2:调用commit进行提交
            事务1:再次查询上次的记录
           
            ***此时事务1对同一数据查询了两次,可得到的内容不同,称为不可重复读
           
        幻读:同一事务中,用同样的操作读取两次,得到的记录数不相同
            事务1:查询表中所有记录
                              -------------->事务2:插入一条记录
                              -------------->事务2:调用commit进行提交
            事务1:再次查询表中所有记录
           
            ***此时事务1两次查询到的记录是不一样的,称为幻读
            详细解释:
                幻读是指当事务不是独立执行时发生的一种现象,例如第一个事务对一个表中的数据进行了修改,
                这种修改涉及到表中的全部数据行。同时,第二个事务也修改这个表中的数据,这种修改是向表
                中插入一行新数据。那么,以后就会发生操作第一个事务的用户发现表中还有没有修改的数据行,
                就好象发生了幻觉一样。

处理以上隔离级别的问题,采用如下方是:

  事务隔离五种级别:
        TRANSACTION_NONE  不使用事务。
        TRANSACTION_READ_UNCOMMITTED  允许脏读。
        TRANSACTION_READ_COMMITTED  防止脏读,最常用的隔离级别,并且是大多数数据库的默认隔离级别
        TRANSACTION_REPEATABLE_READ  可以防止脏读和不可重复读,
        TRANSACTION_SERIALIZABLE  可以防止脏读,不可重复读取和幻读,(事务串行化)会降低数据库的效率

  以上的五个事务隔离级别都是在Connection接口中定义的静态常量,

  使用setTransactionIsolation(int level) 方法可以设置事务隔离级别。
        如:con.setTransactionIsolation(Connection.REPEATABLE_READ);

  注意:事务的隔离级别受到数据库的限制,不同的数据库支持的的隔离级别不一定相同

 

      1 脏读:修改时加排他锁,直到事务提交后才释放,读取时加共享锁,读取完释放事务1读取数据时加上共享锁后(这 样在事务1读取数据的过程中,其他事务就不会修改该数据),不允许任何事物操作该数据,只能读取,之后1如果有更新操作,那么会转换为排他锁,其他事务更 无权参与进来读写,这样就防止了脏读问题。

       但是当事务1读取数据过程中,有可能其他事务也读取了该数据,读取完毕后共享锁释放,此时事务1修改数据,修改 完毕提交事务,其他事务再次读取数据时候发现数据不一致,就会出现不可重复读问题,所以这样不能够避免不可重复读问题。

      2 不可重复读:读取数据时加共享锁,写数据时加排他锁,都是事务提交才释放锁。读取时候不允许其他事物修改该数据,不管数据在事务过程中读取多少次,数据都是一致的,避免了不可重复读问题
      3 幻读问题:采用的是范围锁RangeS RangeS_S模式,锁定检索范围为只读,这样就避免了幻影读问题,在这里有个描述范围锁的文章

 

当执行不同的隔离级别时,可能会发生各种各样不同的问题。下面对它们进行总结并举例说明:

幻读 :幻读发生在当两个完全相同的查询执行时,第二次查询所返回的结果集跟第一个查询不相同。

发生的情况:没有范围锁。

例子:

事务1事务2
SELECT
 * FROM
 users
WHERE age BETWEEN 10 AND 30 ;
 
 
INSERT
  INTO
 users VALUES
(3
, 'Bob'
, 27
 )
;
SELECT
  * FROM
 users 
WHERE
age BETWEEN 10 AND 30 ;

 

 如何避免:实行序列化隔离模式,在任何一个低级别的隔离中都可能会发生。

 

 

不可重复读

在基于锁的并行控制方法中,如果在执行select时不添加读锁,就会发生不可重复读问题。

在多版本并行控制机制中,当一个遇到提交冲突的事务需要回退但却被释放时,会发生不可重复读问题。

 

事务1事务2
SELECT
 * FROM users WHERE id=1;
 
 
UPDATE
 users SET
 age = 21

WHERE
 id = 1
;
COMMIT; /* in multiversion concurrency*/
control, or lock-based READ COMMITTED *

SELECT
 * FROM
 users 
WHERE id = 1 ;
 
 
COMMIT; /* lock-based REPEATABLE READ */

 

在上面这个例子中,事务2提交成功,它所做的修改已经可见。然而,事务1已经读取了一个其它的值。在序列化和可重复读的隔离级别中,数据库管理系统会返回旧值,即在被事务2修改之前的值。在提交读和未提交读隔离级别下,可能会返回被更新的值,这就是“不可重复读”。

 

有两个策略可以防止这个问题的发生:

1. 推迟事务2的执行,直至事务1提交或者回退。这种策略在使用锁时应用。

2. 而在多版本并行控制中,事务2可以被先提交。而事务1,继续执行在旧版本的数据上。当事务1终于尝试提交时,数据库会检验它的结果是否和事务1、事务2顺序执行时一样。如果是,则事务1提交成功。如果不是,事务1会被回退。

 

脏读

脏读发生在一个事务A读取了被另一个事务B修改,但是还未提交的数据。假如B回退,则事务A读取的是无效的数据。这跟不可重复读类似,但是第二个事务不需要执行提交。 

 

事务1事务2
SELECT
 * FROM users WHERE id=1
 
 
UPDATE 
users SET age=21
WHERE id=1;
SELECT

 * FROM users WHERE id=1;
 
 
COMMIT; /* lock-based DIRTY READ */

面试官:说说事务的ACID,什么是脏读、幻读? 一、事务 事务是数据库管理系统执行过程中的一个逻辑单位,由一个有限的数据库操作序列构成。–摘自百科 在MySQL里,事务是在引擎层面实现,比如MyIsam不支持,InnoDB支持 二、ACID 提到事务,肯定会想到 ACID 是吧,自行感受一下概念,然后我们来讲讲隔离性的问题。 原子性:事务的所有操作要么全部成功,要么全部回滚。 一致性:总是从一个一致性的状态转换到另一个一致性的状态... 阅读详情

相关推荐

脏读、幻读、不可重复读产生的原因及解决方案

在平时操作数据库时,尤其是在并发场景下,常常会遇到一些问题,比如脏读、幻读、不可重复读,本篇我将对这几个问题产生的原因进行分析并给出解决办法

2402_84949062的博客 1333

幻读是什么,幻读有什么问题

如果查询的是主键\索引列,则是行锁。如果查询的是没有主键\索引的话,则是表锁。对于for update加的是行锁还是表锁,可以看面试官问:select…for update会锁表还是锁行?来源:自己整理的MySQL实战45讲笔记。

热爱永不过时! 4116

【MySQL】脏读,幻读,不可重复读

脏读,幻读,不可重复读,脏读和幻读和不可重复读的区别

weixin_74127402的博客 1292

七. 幻读是什么,幻读有什么问题

什么是幻读 幻读指的是一个事务在前后两次查询同一个范围的时候,后一次查询看到了前一次查询没有看到的行。 在可重复读隔离级别下,普通的查询是快照读,是不会看到 别的事务插入的数据的。因此,幻读在“当前读”下才会出现。 上面session B的修改结果,被session A之后的select语句用“当前读”看到,不能称为“幻读”。幻读仅专指“新插入的行”。 我们新建一张表,插入6条数据: CREATE TABLE `t` ( `id` int(11) NOT NULL, `c` int(11) DE

Tyella的博客 2万+

Materials Studio多层聚合物建模全流程:从Build Layers到LAMMPS data文件导出避坑指南

本文详细解析了使用Materials Studio构建多层聚合物模型并导出为LAMMPS data文件的全流程。重点剖析了Build Layers工具的核心逻辑、真空层处理技巧,并提供了解决导出过程中Z轴坐标偏移问题的实战方案,特别是如何利用msi2lmp工具的-shift参数进行精准校正,确保模型在LAMMPS中模拟的稳定性和准确性。

hhh00的博客 906

Python之美——Python2与Python3多版本共存

Python多版本共存的方法Python2、Python3共存的方法python2下载及环境变量配置第一步、打开Python官网,下载Python2第二步、python2环境变量配置测试结果 Python2、Python3共存的方法 方法如下: 1.先确保不同版本解释器的python.exe所在的路径在环境变量中 2.拷贝各自的python.exe并重命名即可 步骤(理解不了下面有图示): 1、首先你需要将不同的python版本安装,且都已经将跟版本的环境变量配置好了,python3和2的下载方式

chenchen5152的博客 3937

mysql45讲:讲幻读是什么,幻读有什么问题

我在文章一开始就说过,如果没有特别说明,今天和你分析的问题都是在可重复读隔离级别下的,间隙锁是在可重复读隔离级别下才会生效的。关于这个问题本身的答案是,如果读提交隔离级别够用,也就是说,业务不需要可重复读的保证,这样考虑到读提交下操作数据的锁范围更小(没有间隙锁),这个选择是合理的。进一步地,这两个不同的隔离级别现象有什么不一样的,关于我们的业务,“用读提交就够了”这个结论是怎么得到的?但是,如果DBA认为之所以这么用的原因是“大家都这么用”,那就有问题了,或者说,迟早会出问题。

qq_62556650的博客 1857

零基础也能搞定!华为USG6000V防火墙WEB管理界面开启教程

本文详细介绍了华为USG6000V防火墙WEB管理界面的开启教程,从环境准备、网络配置到防火墙初始化,逐步指导用户完成图形化管理界面的搭建。特别适合零基础用户快速掌握企业级防火墙的可视化操作,提升安全管理效率。

grape的博客 780

一文详解脏读、不可重复读、幻读

MySQL 是支持多事务并发执行的。否则来一个事务处理一个请求,处理一个人请求的时候,其它事务都等着,那估计都没人敢用MySQL作为数据库,因为用户体验太差,估计都要砸键盘了。 既然事务可以并发操作,这里就有一些问题:一个事务在写数据的时候,另一个事务要读这行数据,该怎么处理?一个事务在写数据,另一个数据也要写这行数据,又该怎么处理这个冲突? 这就是并发事务所产生的一些问题。具体来说就是:脏读、不可重复读和幻读。 一、概念说明 以下几个概念是事务隔离级别要实际解决的问题,所以需要搞清楚都是什么意思。 1、脏

weixin_41814871的博客 4万+

JAVA + 海康威视SDK + FFmpeg+ SRS 实现海康威视摄像头二次开发

海康威视SDK接入方案摘要 本文介绍了使用海康威视官方SDK开发物联网平台摄像头接入功能的完整方案。系统采用Java后端集成HCNetSDK控制摄像头,通过FFmpeg将RTSP流转为RTMP推送到SRS流媒体服务器,前端基于HTTP-FLV协议实现视频播放。文章详细说明了开发准备工作,包括SDK下载、SRS部署、FFmpeg安装等关键步骤,并提供了数据库表设计和接口定义。核心部分展示了如何集成海康SDK,包括提取必要代码、加载DLL文件、配置打包插件等具体实现细节,最终形成了一套支持实时预览、回放和下载的

2401_83057947的博客 2245

BART non-Cartesian 重建:并行成像 压缩感知

本文主要使用并行成像和压缩感知方法实现non-Cartesian MRI 数据的重建。

张哥频道:电生理信号和磁共振成像 1176

快速理解脏读、不可重复读和幻读

MySQL的InnoDB引擎是支持事务的,但是并发事务的处理又会带来以下问题: 脏读 不可重复度 幻读 一、脏读 脏读指事务A读取到了事务B更新了但是未提交的数据,然后事务B由于某种错误发生回滚,那么事务A读取到的就是脏数据。 具体的说,一个数据原本是干净的,但是事务B将它进行修改使得其不再干净,此时事务A读取到事务B修改后的数据,也就是脏数据,称为脏读,后来事务B由于良心发现又将数据回滚为最初的样子,而事务A不知道事务B进行了回滚操作,最终事务A读取到的是脏数据,称为脏读。 结论:读取未提交的数据!

郑皓云的博客 8585

动态扩缩容引发的JVM堆内存震荡:从原理到实践的GC调优指南

本文分析了 JVM 内存弹性机制及其在高负载环境中的挑战,重点探讨了堆内存伸缩、内存扩展与收缩的核心机制。通过对系统发布后 GC 雪崩事件的分析,文章揭示了多代际内存管理中的响应差异,尤其是年轻代、老年代与 Metaspace 的协调问题。为避免这些问题,提出了优化内存配置、调整 GC 策略和合理设置代际大小的解决方案。此外,文章进一步探讨了从被动响应到主动防御的转变,建议结合智能调节与自动化监控机制。

曾经“等你生日那天”都遥远得像未来,如今却可欢愉的挥手说“下个十年见” 15万+

【MySQL理论】脏读、不可重复读、幻读

文章目录1. 脏读(dirty read)脏读是指事务读取到其他事务未提交的数据2. 不可重复读(non-repeatable read)不可重复读是指在同一次事务中前后查询不一致的问题3. 幻读(phantom read)幻读是一次事务中前后数据量发生变化,用户产生不可预料的问题4. 总结5. 解决方法 1. 脏读(dirty read) 脏读是指事务读取到其他事务未提交的数据 例如:有事务A、B和一条记录:id为1,name为张三 B首先进行更新操作,将name的值由张三改为张老三,但还未提交事务 be

Hi there 1万+

数字电路逻辑与设计实验三 译码器和数据选择器

1. 译码器功能测试 将 74LS139 按图 3.1 接线,按表 3.2 输入电平分别置位,填输出状态表。 2. 译码器转换 将双 2-4 线译码器转换为 3-8 线译码器。 (1)画出转换电路图。 (2)在实验箱上接线并验证设计是否正确。 (3)设计并填表写该 3-8 线译码器功能表,画出输入、输出波形。 3. 数据选择器的测试及应用 (1) 将双 4 选 1 数据选择器 74LS153 参照图 3.2 接线,测试其功能并填写功能表 3.3。 (2)将实验箱脉冲信号源中固定连续脉冲 4 个不

欢迎交流学习心得 3081

Android性能分析深度指南:Perfetto工具全面解析

本文深入探讨Android性能优化工具Perfetto的应用与实践。作为Google推出的新一代追踪系统,Perfetto整合了CPU调度、内存分配、电池状态等多维度分析功能,通过高性能数据处理和可视化界面帮助开发者定位性能瓶颈。文章系统介绍了Perfetto的架构原理、配置方法和核心功能,包括CPU性能分析、内存泄漏检测等关键技术。通过电商应用卡顿优化的实战案例,展示了如何利用数学建模(如帧时间公式$T_{\text{render}}\leq16.67\text{ms}$)指导性能调优。

郑伟强dev的专栏 135

关于对mysql脏读、幻读、不可重复读的理解

一、脏读、不可重复读、幻读 1、脏读:脏读就是指当一个事务正在访问数据,并且对数据进行了修改,而这种修改还没有提交到数据库中,这时,另外一个事务也访问这个数据,然后使用了这个数据。 例如: 张三的工资为5000,事务A中把他的工资改为8000,但事务A尚未提交。 与此同时, 事务B正在读取张三的工资,读取到张三的工资为8000。 随后, 事务A发生异常,而回滚了事务。张三的工资又回滚为5000。 最后, 事务B读取到的张三工资为8000的数据即为脏数据,事务B做了一次脏读。 2、不可重复读:是指在一个事务内

weixin_43790562的博客 6816

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

一文搞懂MySQL脏读,幻读和不可重复读

数据库 锁机制

liuqinhou的博客 3039

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

MySQL InnoDB引擎 脏读、不可重复读和幻读

MySQL InnoDB引擎 脏读、不可重复读和幻读

醉逸鎏年的博客 947

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

脏读、不可重复读、幻读到底是干什么的?

Undo Log的作用记录数据修改前的版本,用于回滚(如脏读场景中,事务回滚时通过Undo Log恢复原始值)。在级别下,配合MVCC提供历史版本数据,避免不可重复读。Redo Log的作用记录数据修改后的版本,用于事务提交时的持久化(先写日志再写磁盘,提升性能)。崩溃恢复时,通过Redo Log重做未完成的事务操作。锁机制(Lock)与MVCC的配合低隔离级别:依赖锁(如共享锁、排他锁)控制访问,但锁粒度粗(表锁)会影响性能。高隔离级别。

长风破浪会有时的博客 1555

MySQL专题: 脏读、不可重复读、幻读区别

转载:MySQL专题: 脏读、不可重复读、幻读区别 目录 脏读(Dirty Read) 不可重复读 幻读 幻读和不可重复读的区别     脏读(Dirty Read) 读取到了未提交的数据(如果事务这时候回滚了,那么第二个事务就读到了脏数据) 原因可能有: (1)有一个交叉的事务有新的commit,导致了数据的改变; (2)一个数据库被多个实例操作时,同一事

明耀的博客 1万+

脏读、幻读和不可重复读

一、引言 脏读、不可重复读和幻读是数据库中由于并发访问导致的数据读取问题。当多个事务同时进行时可以通过修改数据库事务的隔离级别来处理这三个问题。 二、问题解释 1、脏读(读取未提交的数据) 脏读又称无效数据的读出,是指在数据库访问中,事务 A 对一个值做修改,事务 B 读取这个值,但是由于某种原因事务 A 回滚撤销了对这个值得修改,这就导致事务 B 读取到的值是无效数据。 2、不可重复读(前后数据多次读取,结果集内容不一致) 不可重复读即当事务 A 按照查询条件得到了一个结果集,这时事务 B 对事务 A .

qq_23696693的博客 2709

MySQL中什么是脏读、幻读、不可重复读

本文详细介绍了什么是mysql中的脏读、幻读、不可重复读

驴大毛的博客 1166

脏读、幻读、不可重复读

在数据库事务管理中,是三种常见的读一致性问题,它们与事务的隔离级别密切相关。

qq_73683016的博客 1392

关于脏读,不可重复读和幻读

​ 脏读,不可重复读和幻读都是对于来说的,可以看成。按照对事务的定义,必须满足。

qq_30004513的博客 967
下一篇: 2009-09-23解决的问题
娉婷临水立
博客等级 码龄20年 6粉丝 6原创
评论 15
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值