为什么会有脏读问题?

网上给的定义时,一个事务读到另一个事务未提交的数据。
不明白为什么一个事务会读到另一个事务未提交的数据?
如果一个事务未提交数据,那另一个事务为什么会读到呢?

还请各位不吝指点下

可能是我解释的不够 清楚吧!

呵呵 不过也多大关系 他们描述的也很到位了!
不要去可以的追求那些概念 就先这么理解吧

因[quote]为update时先更新的是cache,而select操作正好是先在cache里找,
如果事务a先更新到cache里,而还没有更新到库
这时事务b正好select这条数据,就形成脏读[/quote]

因为update时先更新的是cache,而select操作正好是先在cache里找,
如果事务a先更新到cache里,而还没有更新到库
这时事务b正好select这条数据,就形成脏读

脏数据在临时更新(脏读)中产生。事务A更新了某个数据项X,但是由于某种原因,事务A出现了问题,于是要把A回滚。但是在回滚之前,另一个事务B读取了数据项X的值(A更新后),A回滚了事务,数据项恢复了原值。事务B读取的就是数据项X的就是一个“临时”的值,就是脏数据。

B就进行了脏读,B读取的"临时"的值就是脏数据!!

[quote]如果一个事务未提交数据,那另一个事务为什么会读到呢? [/quote]

事物没提交 数据库里面的数据就不会改变了?
很显然 不对! 你可以本地测试一下! 已经变了!只是没提交事物之前这些数据是还可以回滚的!

如果在 mysql 可以
begin
sql 语句 // 这个sql语句执行的时候 数据库里面就可以看到相应的变化
commit ,或者 rollback

            不多说了! 试试就知道!

[quote]
那么是不是stmt.update(sql);数据库中就改变了?我debug到这行结束时数据库是不改变的。按照您这么说rollback又执行一条delete?
不知道是不是我没有理解您的意思。 [/quote]
恩 ! 这个是正常存在的! 因为有些事物的默认设置 或者 一些非事物操作!

我的意思你要看的更明白可以在
sql/young 里面实验:
begin
[color=red] sql 语句 // 这个sql语句执行的时候 数据库里面就可以看到相应的变化 [/color]commit ,或者 rollback

[quote]也有一个类似于hibernate那种对象关系图 映射数据库内容一样,数据库也是加载到内存中和磁盘介质真实数据形成一个映射? [/quote]

这个是不对的! 这个关系图是 hibernate 加载的!

[quote]就是数据库把所有内容都加载到内存中,所有的操作在内存中。如果不commit,真实物理介质中的内容就不会有变化。 [/quote]

首页数据库肯定在内存里面跑!
操作内存或者说是缓存里面的对象! 而真实物理介质中的内容就不会有变化

这个是由第三方决定的! 比如 hibernate! 对于数据库来说 默认是 事物自动提交

所以的我让你这么干 理解会很快的:
sql/young 里面实验:
begin // 开启事物 不自动提交

[color=red] sql 语句 // 这个sql语句执行的时候 数据库里面就可以看到相应的变化 [/color] 但 还可以回滚的

commit ,或者 rollback

我 感觉其实你基本已经理解 [color=red]脏读[/color]了

现在只是一些 细节问题的 思维咩到位! 实验下吧! 相信你很快就明白了!

读到缓存的数据和数据库的数据是两份