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是不会执行的。
我不是老赵,斗胆回答你的问题。我之前没有用过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
俺不是老赵,只能看看!关注你的老赵!
注:mssql默认情况下,update事务没提交,select是不会执行的。
这句话是错误的,你自己可以试一试.
http://space.cnblogs.com/question/5690/