mysql隔离级别与sql blocking之间的关系
上一篇 /
下一篇 2012-06-19 14:49:24
/ 个人分类:others
a、隔离级别为:read commit(不允许脏读)session 1 window:set autocommit=0update table1 set field = new value where condition_field=condition_value;session 2 window:select @@global.tx_isolation(此时的隔离级别应该为read commit)select * from table1;这个时候你会发现,session 1 update的数据,在session 2的select 里面是看不到修改的,因为此时的隔离级别是不允许脏读的在session 1 window中commit,然后再次在session 2中执行检索sql,可以检索到最新的修改b、隔离级别修改:set global transaction isolation level read uncommitted(允许脏读);session 1 window:set autocommit=0update table1 set field = new value where condition_field=condition_value; session 2 window:select @@global.tx_isolation(确认此时的mysql global transaction isolation level is read uncommitted[可脏读])select * from table1;这个时候即使我没有在session 1 window里面commit,但是也可以看到update的数据。C、隔离级别的修改:set global transaction isolation level repeatable read;(可重复读隔离级别)PS:这个地方要特别注意下,mysql这里的可重复读跟别的数据库不一样,mysql的可重复读隔离级别是不会出现幻读的,什么意思呢?看效果session 1 window:同样,autocommit为off(0)状态insert into table1 values (......);session 2 window:select @@global.tx_isolation(确认为repeatable-read模式)select * from test;这个时候,你会发现,在session 1没有做commit的时候,在session 2 window执行select的时候,是看不到在session 1 window执行的insert但未commit的数据的。因为mysql这里的repeatable-read的隔离级别就是不允许幻读的。在session 1 window中执行commit之后,再在session 2 Window中执行select之后,在session 1 window中做的修改就都可以看到了,恩,对的,在这个地方能够看到修改就是有问题了,因为在repeatable read(mysql)里面,这个隔离级别是可重复读的,即使我们session 1 window做了commit之后,session 2 window应该也是不能看到的。除非,session 2 window也做了commit,具体的读者可以自己动手实验一把,只需要在session 2 windows的开始也将autocommit设置为0.D、隔离级别修改:set global transaction isolation level serializable(修改隔离级别为串行话,串行话的隔离级别,每次读都需要获得表级共享锁,继续看实验)session 1 window:set autocommit=0;select @@global.tx_isolation(确认隔离级别修改有效)update table1 set field_name = new value where condition_field_name = condition_value;session 2 window:select * from table1(这个时候select 是木有问题的)但是,这个时候,我们在session 2 window里面执行update这样的写操作的时候,update一下看:yes。出现了:Lock wait timeout exceeded,这个时候就出现了阻塞,因为在此隔离级别的情况下,会自动的加上一个共享锁,只能读不允许写的,写会被阻塞。如果此时,在session 2报错之前,session 1 进行了commit呢?请读者自己动手实验一把吧。PS:以上均建立在mysql数据库,存储引擎为innodb,锁级别为行级锁的基础上。
收藏
举报
TAG: