为什么会有脏读问题?

问题描述

网上给的定义时,一个事务读到另一个事务未提交的数据。不明白为什么一个事务会读到另一个事务未提交的数据?如果一个事务未提交数据,那另一个事务为什么会读到呢?还请各位不吝指点下 问题补充:7454103 写道

解决方案

可能是我解释的不够 清楚吧! 呵呵 不过也多大关系 他们描述的也很到位了!不要去可以的追求那些概念 就先这么理解吧 因引用为update时先更新的是cache,而select操作正好是先在cache里找, 如果事务a先更新到cache里,而还没有更新到库 这时事务b正好select这条数据,就形成脏读
解决方案二:
我 感觉其实你基本已经理解 脏读了现在只是一些 细节问题的 思维咩到位! 实验下吧! 相信你很快就明白了!
解决方案三:
引用就是数据库把所有内容都加载到内存中,所有的操作在内存中。如果不commit,真实物理介质中的内容就不会有变化。 首页数据库肯定在内存里面跑! 操作内存或者说是缓存里面的对象! 而真实物理介质中的内容就不会有变化这个是由第三方决定的! 比如 hibernate! 对于数据库来说 默认是 事物自动提交所以的我让你这么干 理解会很快的:sql/young 里面实验: begin // 开启事物 不自动提交 sql 语句 // 这个sql语句执行的时候 数据库里面就可以看到相应的变化 但 还可以回滚的commit ,或者 rollback
解决方案四:
引用也有一个类似于hibernate那种对象关系图 映射数据库内容一样,数据库也是加载到内存中和磁盘介质真实数据形成一个映射? 这个是不对的! 这个关系图是 hibernate 加载的!
解决方案五:
引用 那么是不是stmt.update(sql);数据库中就改变了?我debug到这行结束时数据库是不改变的。按照您这么说rollback又执行一条delete? 不知道是不是我没有理解您的意思。 恩 ! 这个是正常存在的! 因为有些事物的默认设置 或者 一些非事物操作!我的意思你要看的更明白可以在 sql/young 里面实验: begin sql 语句 // 这个sql语句执行的时候 数据库里面就可以看到相应的变化 commit ,或者 rollback
解决方案六:
引用如果一个事务未提交数据,那另一个事务为什么会读到呢? 事物没提交 数据库里面的数据就不会改变了?很显然 不对! 你可以本地测试一下! 已经变了!只是没提交事物之前这些数据是还可以回滚的!如果在 mysql 可以 begin sql 语句 // 这个sql语句执行的时候 数据库里面就可以看到相应的变化commit ,或者 rollback 不多说了! 试试就知道!
解决方案七:
脏数据在临时更新(脏读)中产生。事务A更新了某个数据项X,但是由于某种原因,事务A出现了问题,于是要把A回滚。但是在回滚之前,另一个事务B读取了数据项X的值(A更新后),A回滚了事务,数据项恢复了原值。事务B读取的就是数据项X的就是一个“临时”的值,就是脏数据。 B就进行了脏读,B读取的"临时"的值就是脏数据!!
解决方案八:
因为update时先更新的是cache,而select操作正好是先在cache里找,如果事务a先更新到cache里,而还没有更新到库这时事务b正好select这条数据,就形成脏读

时间: 2024-09-19 07:25:25

为什么会有脏读问题?的相关文章

脏读、不可重复读、幻读

锁就是防止其他事务访问指定的资源的手段.锁是实现并发控制的主要方法,是多个用户能够同时操纵同一个数据库中的数据而不发生数据不一致现象的重要保障.一般来说,锁可以防止脏读.不可重复读和幻觉读.   事务并发产生的问题:         脏读:一个事务读取到了另外一个事务没有提交的数据             事务1:更新一条数据                              ------------->事务2:读取事务1更新的记录             事务1:调用commit进行提

SQL Server 中的事务与事务隔离级别以及如何理解脏读, 未提交读,不可重复读和幻读产生的过程和原因

原文:SQL Server 中的事务与事务隔离级别以及如何理解脏读, 未提交读,不可重复读和幻读产生的过程和原因 原本打算写有关 SSIS Package 中的事务控制过程的,但是发现很多基本的概念还是需要有 SQL Server 事务和事务的隔离级别做基础铺垫.所以花了点时间,把 SQL Server 数据库中的事务概念,ACID 原则,事务中常见的问题,问题造成的原因和事务隔离级别等这些方面的知识好好的整理了一下. 其实有关 SQL Server 中的事务,说实话因为内容太多, 话题太广,稍

.NET中 关于脏读 不可重复读与幻读的代码示例_实用技巧

并发可能产生的三种问题 脏读 定义:A事务执行过程中B事务读取了A事务的修改,但是A事务并没有结束(提交),A事务后来可能成功也可能失败. 比喻:A修改了源代码并且并没有提交到源代码系统,A直接通过QQ将代码发给了B,A后来取消了修改. 代码示例 复制代码 代码如下: [TestMethod]         public void 脏读_测试()         {             //前置条件             using (var context = new TestEnti

Oracle Undo与脏读解析

Undo就是用来记录保存事务操作过程中的数据,如果事务发生错误,可以之前的数据进行填补. Undo segment 是保存在表空间上的.Undo 大小是固定的,既然是固定的也就是有限的.如果保存的记录非常多,那么它就会被占满,新记录的数据会覆盖掉最早的数据. 在Oracle数据库中,undo主要有三大作用:提供一致性读(Consistent Read).回滚事务(Rollback Transaction)以及实例恢复(Instance Recovery). 一致性读是相对于脏读(DirtyRea

使用事件进行同步、事务隔离级别为脏读 还是出现事务死锁问题

问题描述 整个程序就两个业务处理,如下:(1)一个纯查询业务:QueryData(){多个表查询操作······}(2)一个数据更新业务:publicstaticAutoResetEventmEvent=newAutoResetEvent(true);//静态的全局事件对象,用于事务并发同步控制,保证任一时刻只有一个事务得到执行.UpdateData(){//数据更新业务mEvent.WaitOne();//等待信号SqlTransactiontran=BeginTransaction(Syst

脏读和数据库一致性的分析

脏读 脏读:在业务中读取的数据出现不一致的错误. package demo; /* 脏读:数据不一致的错误. * * 在对一个对象的方法加锁的时候,需要考虑业务的整体性, * 在demo中为setUser/getUser方法同时加锁synchronized同步关键字, * 保证业务的原子性,不然会出现业务错误. * */ public class DirtyRead { private String userName = "lc"; private String password =

事务 脏读、不可重复读、幻影读的分析

1 丢失修改 2 脏读:当事务1修改了一条记录,没有提交时,事务2读取了该记录:当事务1回滚了,那么事务2的记录就是一条不存在的记录: 3 不可重复读:当事务1读取了一条记录,未提交事务,事务2修改了该条记录并且提交事务:事务1又读取了该条记录,发现两条记录不一样: 4 幻影读:当事务1根据某种检索条件读取了若干条记录,未提交事务:而事务2又插入了一条记录,该记录也符合事务1的检索条件:那么当事务1在根据相同查询条件检索数据时候,出现了不一致的现象. 根据锁机制来避免上诉问题: 排他锁:数据加锁

事务隔离级别小记

事务的四个属性:原子性(atomicity).一致性(consistency).隔离性(isolation)和持久性(durability). 1.原子性(Atomic)     最重要的原则,也是最容易理解的原则.被事务管理的所有方法,要么一起被提交,要么一起回滚. 2.一致性(Consistency)     事务在系统完整性中实施一致性,如果事务成功地完成,那么系统中所有变化将正确地应用,系统处于新有效状态.如果在事务中出现错误,那么系统中的所有变化将自动地回滚,系统返回到原始状态. 3.

RocksDB事务实现TransactionDB分析

基本概念 1. LSN (log sequence number) RocksDB中的每一条记录(KeyValue)都有一个LogSequenceNumber(后面统称lsn),从最初的0开始,每次写入加1.该值为逻辑量,区别于InnoDB的lsn为redo log物理写入字节量. 这个lsn在RocksDB内部的memtable中是单调递增的,在WriteAheadLog(WAL)中以WriteBatch为单位递增(count(batch.records)为单位). WriteBatch是一次