mysql隔离级别与sql blocking之间的关系

上一篇 / 下一篇  2012-06-19 14:49:24 / 个人分类:others

a、隔离级别为:read commit(不允许脏读)


session 1 window:
set autocommit=0
update 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=0
update 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:

 

评分:0

我来说两句

Open Toolbar