一个事务读取另一个事务未提交的内容,称为脏读。但事务的隔离性定义中又有这样的描述:“当前事务不会查看由另一并发事务正在修改的数据。“在脏读时,一个事务读取了另一个事务未提交的内容,难道未提交的内容不算是另一并发事务正在修改的数据吗?如果不算,事务的隔离性如何体现呢,什么才算是”事务正在修改的数据?自学Mysql中,有些抽象的概念还是有些模糊,希望各位高人不吝赐教。

解决方案 »

  1.   


    一个事务读取另一个事务未提交的内容,称为脏读。这个问题就是 因为没有提交,比如,一条数据有个字段 v,现在有个事务A把这个v从10改成了100,但是呢,没有commit,这个时候另一个事务B 如果读取了值,也就是100,而这个时候,刚才事务A因为其他原因 把事务rollback了,那么这时候事务B读取到的就是不准确的数据,这就是脏读。当然,如果事务A最后提交了,那么事务B读取到的也是正确的数据,但这个也是脏读。所以,是不是脏读和 读取到的数据是否正确没有关系,只是说 读取到的是 不确定的数据。
      

  2.   


    另外,在mysql中是无法读取到脏数据的,因为myisam存储引擎是 表级别的锁,并发性很差。而innodb存储引擎,支持mvcc,多版本并发控制,你读取到的 总是已提交的数据。而在oracle中也是如此。那么现在说到 能读取脏数据,那只有 sql server了,你可以在查询中指定 nolock,或者 指定隔离级别为 read uncommitted,这个就是脏读,也就是说 可以读取到未提交的数据,那么好处是 在读取数据时 不需要 读锁,所以不会被修改数据的事务 锁定。
      

  3.   

    我也一直弄不明白这个概念上的定义。事务A读取了事务B中正在修改的数据。那么事务A本身就违背了自身的隔离性原则。它还算是个事务吗?
      

  4.   

    读取了事务B中正在修改的数据。事务隔离级别为未提交(uncommited)读才会这样
    cmmited级别不会出现脏读。
      

  5.   

    事务的隔离性并不是:A事务修改的东西,B看不到。
    这句话只是事务的隔离性中的隔离级别之一
    什么违反了隔离性简直是谬论,最低的一层隔离级别的时候,A事务修改的东西,B当然看得到!
      

  6.   


    在mysql中如何实现读取事务“未提交”的数据呢?
    Read Uncommitted读未提交级别可以实现吗?
    SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;