问题描述
网上给的定义时,一个事务读到另一个事务未提交的数据。不明白为什么一个事务会读到另一个事务未提交的数据?如果一个事务未提交数据,那另一个事务为什么会读到呢?还请各位不吝指点下 问题补充: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这条数据,就形成脏读