一个普通的select语句(不带锁模式)在uncommit read模式下,读到的是未提交的数据在commit read模式下,读到未提交的数据但是同由于这个查询不会等待另一个修改事务的结束,因此读到的都是错误数据,除非select ... lock in xxx,才能等待另一个事务的结束select ... lock in xxx不放在事务里,同样也可以等待另一事务的结束那设置这个隔离级别还有什么意思呢?
t1:begin;
delete from t1 where id > 6;
t2:begin;
select * from t1 where id > 6;在除顺序读之外的三个级别下,读到的数据都是不正确的

解决方案 »

  1.   

    但是,oracle或informix数据库,在commited read模式下,是会等待另一事务结束的
    要避免这种问题,是不是一定要在select中显示的加上锁模式啊
      

  2.   

    你看看ORACLE的默认隔离级别是什么,MySQL的又是什么?
      

  3.   

    oracle没试过,Informix我试过了,默认的是commited read,是出错的,说是记录被锁
    mysql是repeatable read,没什么用
      

  4.   

    mysql 的MYISAM是不支持事务,innodb支持事务MYSQL的事务隔离是正确的。commit read , repeatable read 不会读另外进程未提交的脏数据。
      

  5.   

    同一个connection中的不同query中像是事务不起作用。
    不同的connection中是可以的。不知原因何在,期待大侠解决。。关注。。
      

  6.   

    事务是基于connection的, 同一个connection 任何一个时刻只能有一个事务。
      

  7.   


    那.net连接MySql在同一connection,不同session情况下,支持事务吗?
      

  8.   

    session是个模糊的概念,不同的语言、平台有不同的解释。
    不知道net, 同一个connection, 不同session,到底是什么样的概念。
    对mysql服务端来说,它不管你客户端如何定义,一个连接(说白了就是一个tcp socket)就是一个最小单位, 某一个时刻只能维持一个事务。
      

  9.   

    我指的就是在不同的连接里,开两个mysql客户端,测试两个事务并发的情况下,得出的结论
      

  10.   

    commit read , repeatable read 不会读另外进程未提交的脏数据。
    是不会读到脏数据,但是也不同样也不会等待另一个修改事务的结束这也不是想要的结果假如一个链接中的事务向一个钱袋加钱,还没有提交,这时另一链接中的事务想要读到最新余额后做一些判断,然后也向这个钱袋加钱在commit read , repeatable read下,另一事务读到的就是第一个事务未修改前的余额,这样就不对了我想第二个事务就一定要等待第一个事务的结束,才能读到正确的余额,这就需要用serial read级别,或者select... lock mode ...才行
      

  11.   

    关于事务隔离,是有SQL标准的。
    (这里不再多描述)
    至今还没发现某个数据库声称能符合这个标准,而实际达不到。差异是在,各个数据库的内部机制是如何实现这个标准。对于不是MVCC(多版本控制)的数据库如informix,为了能实现其标准,它只能通过自动加锁的方式。而对于MVCC的数据库如INNODB, postgresql, 根本就不用加锁,就可以实现其功能。事务隔离和一致性是2个不同的概念。楼主为了达到一致性,用惯了某种数据库的某种事务隔离度,而刚好这个数据库用内部加锁的方式 满足了一致性,所以就认为所有的数据库都会自动加锁。反之就是错误的。
      

  12.   


    对  事务是正确的,怎么会错误呢?你看你的事务你把时间延迟一下
    在sqlserver  下就很明显,
    t1:begin;
    delete from t1 where id > 6;
    t2:begin ;
    select * from t1 where id > 6;sqlserver 
    如果这样
    set transaction isplation level read commited
    begin tr1
    delete from t1 where id > 6;
    waitfor delay "00:00:10";
    commit tr1然后在10内执行
    set transaction isplation level read commited
    begin tr2
    select * from t1 where id > 6;
    6;
    commit tr2你就会独到的数据是删除后的数据,并且第二个提交的时间也会在第一个提交了后在执行
      

  13.   

    楼主估计用错了存储引擎。InnoDB引擎对事务隔离级支持还是蛮不错的。