您的位置:首页 > 数据库

orcal数据库的事务隔离级别

2018-02-06 12:09 357 查看
回顾下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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  oracle 事务 隔离级别