orcal数据库的事务隔离级别
回顾下mysql数据库的隔离级别和解决问题主要有四种:
(1)read uncommitted – 不能解决任何缺点
(2)read committed – 脏读,Oracle默认
(3)reapatable read – 不可重复读,脏读,MySQL默认
(4)serializable – 幻读,不可重复读,脏读,效率低
事务的隔离级别定义主要是针对多并发性问题。即不同的用户操作同一张表可能引发的问题,才有了事务的隔离。
orcal数据库支持的事务隔离级别主要有两种:
oracle支持:read committed 和 serializable。默认的为read committed.
事务隔离级别的设置必须保证在事务开始之前进行设置,设置代码如下所示:
例如:oracle中设置事务隔离级别为serializable
set transaction isolation level serializable;
我们可以通过如下例子,理解事务隔离。
通过开启两个窗口sqlplus来模拟两个并发用户操作同一张表数据,对一行记录进行删除操作。
用orcal自带的数据库orcl,emp表数据进行模拟测试。
如下图所示:
开启两个窗口,同时删除模拟并发不了,因为计算机在精确到具体小的时间片时,也是只执行一个原子操作,因此可以先执行上面的窗口,在执行下面的窗口,执行delete删除操作,看结果如下。
可以看到由于orcal默认数据库隔离级别为read commit,只有一个线程删除一行记录并且提交事务之后,另一个线程对这行记录进行删除操作,因此,下面的执行delete之后,会一直等待,等待上一个的提交,当上面的线程提交之后,我们来看看结果。
说明此时的上面已提交事务,下面的删除会找不到where条件符合的语句,因此删除0行记录。
接下来再看一个例子:
同样也是删除一行记录,这次试用rollback回滚机制。上面的先执行删除操作,下面的执行删除操作会等待。如果这时候上面的执行回滚操作,结果如下:
上面的执行完rollback,事务会回滚到事务开始的地方,这时候会释放锁,下面的窗口会执行删除操作,因为此时where条件能找到记录。
最后测试脏读:
如果这个时候下面的还没有提交事务,这时上面的查询emp表中的数据,还是会显示12条记录,这就是脏读,即一个线程查看到另一个线程没有提交之前的数据。只有下面的提交事务,查询emp表才会是11条记录。即确定已被删除。
Serializable
就是一个线程执行增删改查的操作,这张表就会被锁住,别的线程连查询都查询不到这张表的数据,隔离级别最高。虽然隔离级别高,但是很明显效率低。
如果对数据库的事务隔离概念,什么是幻读,以及什么是事务特性还不是很明白,可以参考如下博文:
http://blog.csdn.net/nwpu_geeker/article/details/79164450