首页 新闻 会员 周边

mysql锁机制,请教高人。。老赵来回答啊

0
悬赏园豆:5 [已解决问题] 解决于 2009-03-18 13:38

begin

    start transaction;

    update account set username='sdf' where userid=1;
    if sleep(10)=0 then
        select 1;
    end if;
   
    commit;
end


------------------------------------------- 当更新事务没结束时,mysql 默认是可以执行select * from account where userid=1 ;的。。这样就会读脏数据了,有没有办法在update没提交的时候,select不让执行?

select,update 在不同的连接中执行
注:mssql默认情况下,update事务没提交,select是不会执行的。

ITAres的主页 ITAres | 初学一级 | 园豆:107
提问于:2009-03-18 10:32
< >
分享
最佳答案
0

我不是老赵,斗胆回答你的问题。我之前没有用过MySQL,所以我只是在互联网上搜了一下。理解不一定对。

MySQL 有四种事务隔离模式:

 未提交读(Read Uncommitted):允许脏读,也就是可能读取到其他会话中未提交事务修改的数据

  提交读(Read Committed):只能读取到已经提交的数据。Oracle等多数数据库默认都是该级别

  可重复读(Repeated Read):可重复读。在同一个事务内的查询都是事务开始时刻一致的,InnoDB默认级别。在SQL标准中,该隔离级别消除了不可重复读,但是还存在幻象读

  串行读(Serializable):完全串行化的读,每次读都需要获得表级共享锁,读写相互都会阻塞

默认是什么我不太清楚,如果是 Read Uncommitted 则允许读取脏数据。

      你可以同 SET TRANSACTION 来设置全局或者你当前会话的事务隔离模式为 Read Committed 试试看。参见 MySQL 的开发文档:

http://dev.mysql.com/doc/refman/5.0/en/set-transaction.html

 

 

 

eaglet | 专家六级 |园豆:17139 | 2009-03-18 12:48
其他回答(2)
0

俺不是老赵,只能看看!关注你的老赵!

子夜星辰 | 园豆:1613 (小虾三级) | 2009-03-18 11:37
0

注:mssql默认情况下,update事务没提交,select是不会执行的。

这句话是错误的,你自己可以试一试.

http://space.cnblogs.com/question/5690/

winzheng | 园豆:8797 (大侠五级) | 2009-03-18 11:43
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册