DB2的RS和标准定义隔离级别中的REPEATABLE READ(重复读)类似,避免了脏读,但是会出现幻读问题。
UR(Uncommitted Read):未提交读,也就是“脏”读。UR不会加任何锁,可以读数据库中的任何数据,包含已修改但未COMMIT的数据。读的数据可能与真实的数据有一定差距。
UR级别最常用于只读表上的查询,或者只执行查询且不关心能否读到其他程序未COMMIT的数据时常用。
UR相当于标准定义隔离级别中的READ UNCOMMITTED(未提交读)。
MySQL支持标准定义的四种隔离级别,默认的隔离级别为REPEATABLE READ(重复度),但是与标准SQL不同的是,MySQL的InnoDB存储引擎在REPEATABLE READ的隔离级别下,使用Next-Key Lock(锁定一个范围,并锁定记录本身),因此避免幻读的产生。所以说InnoDB存储引擎在REPEATABLE READ的隔离级别下已经能保证事务的隔离性要求,即达到SQL标准的SERIALIZABLE隔离级别。
Oracle数据库支持READ COMMITTED(提交读)和SERIALIZABLE这两种事务隔离级别。默认的隔离级别是READ COMMITTED(提交读)。
二、锁
事务隔离级别是并发控制的整体解决方案,其实际上是综合利用各种类型的锁和行版本控制来解决并发问题。
这里我们主要看数据库中的基本锁。
1、锁的类型
S-LOCK:共享锁。又叫读锁,当用户要进行数据的读取时,对数据加上共享锁。共享锁可以同时加多个;
X-LOCK:排他锁。又叫写锁。SQL INSERT/UPDATE/DELETE语句执行时会上X-LOCK。排他锁只可以加一个,和其他的排他锁共享锁都相斥;
U-LOCK:修改锁。CURSOR SELECT 有UPDATE OF 子句时,FETCH时对读出的记录,会上U-LOCK。
DB2、MySQL、Oracle都支持S-LOCK和X-LOCK,DB2还支持U-LOCK。
2、事务隔离级别中读数据时的锁类型