conn1:
begin
     start transaction;     update account set username='5665656' where userid=1;
     if sleep(10)=0 then
        select 1;
     end if;
     
     commit;
endconn2:
BEGIN
 SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;
 select * from account where userid=1;
END
conn1还没有提交的时候,conn2就可以查询了。。也就是说产生了不可重复读的问题。谁可以解决的?

解决方案 »

  1.   

    这个算不上BUG
    设计上的思路问题
      

  2.   

    READ COMMITTED 一个有些象Oracle的隔离级别。所有SELECT ... FOR UPDATE和SELECT ... LOCK IN SHARE MOD语句仅锁定索引记录,而不锁定记录前的间隙,因而允许随意紧挨着已锁定的记录插入新记录。UPDATE和DELETE语句使用一个带唯一搜索条件的唯一的索引仅锁定找到的索引记录,而不包括记录前的间隙。在范围类型UPDATE和DELETE语句,InnoDB必须对范围覆盖的间隙设置next-key锁定或间隙锁定以及其它用户做的块插入。这是很必要的,因为要让MySQL复制和恢复起作用,“幽灵行”必须被阻止掉。 持续读行为如同在Oracle中:即使在同一事务内, 每个持续读设置并读取它自己的新快照。请参阅15.2.10.4节,“持续非锁定读”。 conn1: 
    begin 
        SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED; 
        start transaction;     update account set username='5665656' where userid=1; 
        if sleep(10)=0 then 
            select 1; 
        end if; 
        
        commit; 
    end conn2: 
    BEGIN 
    SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED; 
    select * from account where userid=1; 
    END