日期:2014-05-16  浏览次数:20409 次

事务的隔离级别研究
今天无聊研究了一下以前没仔细看过的事务隔离级别,目前通用的包括大概是下面的图片的样子:





其中,oralce和其他很多数据库默认第二种级别,mysql默认使用第三种级别。

     根据我的测试,select 语句在任何时候都不会阻塞,即一个事务不管进行何种的DML语句而不提交事务,另外一个事务都可以顺利执行select语句。
     这是因为select语句并不需要获得 操作对象的锁,在oralce中,因为默认隔离级别是“提交读”,所以此时的select语句只能读取到“已提交后的数据”,也正是因为只要数据提交,就能被读取到,所以oralce存在 “不可重复读”。但是mysql的默认隔离级别是第三种,所以这个时候mysql不存在“不可重复读”,因为mysql的处理策略是:必须select语句所在的事务被提交后,才能读取到被其他事务更新的数据。不过根据我的测试有个很奇怪的问题:资料上说mysql存在 幻读,不过我的测试中发现不存在。

     但是DML语句不同,如果一个事务进行了DML操作而不提交事务,那么其他事务的DML语句将不能得到执行(测试了oracle和 mysql5.x innodb引擎)。
     这是因为DML语句的执行需要获得 操作对象(表、视图、行)的锁。