`

oracle 数据库隔离级别

阅读更多
事务不同引发的状况:
      脏读(Dirty reads)
         一个事务读取另一个事务尚未提交的修改时,产生脏读
           很多数据库允许脏读以避免排它锁的竞争。
      不可重复读(Nonrepeatable reads)
          同一查询在同一事务中多次进行,由于其他提交事务所做的修改或删除,每次返回不同的结果集,此时发生非重复读。
      幻读(Phantom reads)
         同一查询在同一事务中多次进行,由于其他提交事务所做的插入操作,每次返回不同的结果集,此时发生幻像读。

数据库操作的隔离级别

未提交读(read uncommitted)
提交读(read committed)
重复读(repeatable read)
序列化(serializable)

oracle默认隔离级别read committed (statement level serialization)

  每一个语句,在语句开始时,会获取一个此刻的数据快照。
  一个事务有多条语句,如果语句之间存在其它完成的事务,
  这可能引起不可持续读和幻读。

新建一个测试表books:
name,code,price三个字段
添加两条测试数据




使用pl/sql和java程序模拟并发

不允许脏读测试:
程序段首先查询code是qqq的书的价格
//获取连接 省略
pstat = conn.prepareStatement("select price from books where code='qqq'");
			rs = pstat.executeQuery();
			while(rs.next()){
			System.out.println("price:"+rs.getDouble(1));
			}
			close();

输出结果:price:15.0
然后pl/sql执行更新
update books set price=18 where code='qqq';

!pl/sql设置成手动更新,不自动更新
在执行上面java查询代码
输出仍是price:15.0,说明读不到pl/sql中未提交的执行结果,即不允许脏读
pl/sql 执行
commit;

在执行java查询:
输出结果:price:18.0

会有不可重复读何幻读的现象发生就不用测试了吧,
这两种现象都是针对提交后事物的读引起的,read commited隔离级别是允许对提交后
的事物进行读的。

隔离级别:重复读(repeatable read)
这个不允许脏读,不可重复读,但是会有幻读现象。
这个oracle不支持,不好测试。
理解的话就是如果一条查询语句查询的内容有其它事物正在更新的时候,这
查询处于等待状态,直到先前事物提交更新后,才会执行本条查询。也就是
查询的时候也会有锁,需要等待并发的事物释放锁。然后自己获取到锁,执行
自己事物。这样查询也加锁,并发性更低
select ... for update 就是这样可以避免不可重复读的发生

隔离级别:serializable
这个就更严格了,事物执行是一个一个的。一个事务中的语句共享同一个数据快照(在事务开始时存在的数据)。
是事物级别的,脏读,不可重复读,幻读根本就没有机会发生。
前面像read committed都是语句级别的,以语句为单元。
比如
read committed一个事物A有a(select),b(select),c(update)三条语句

当A事物执行a,b的时候,若有B事物执行更新操作,是有可能的
因为a,b是不加锁的

写个例子:

			//获取连接和关闭连接代码 省略
			//不自动提交
			conn.setAutoCommit(false);
			/**
			 * a 查询
			 */
			pstat = conn.prepareStatement("select price from books where code='qqq'");
			rs = pstat.executeQuery();
			while(rs.next()){
				//输出 price:25.0
				System.out.println("price:"+rs.getDouble(1));
			}
			close();
			
			/**
			 * 暂停一会,用pl/sql执行B事务
			 * update books set price=15 where code='qqq';
			 * commit;
			 */
			Thread.sleep(10000);
			
			/**
			 * 如果这里再执行a查询的话,和第一次查询结果就不一样,因为中间有B事务的提交更新
			 * 修改,这也是不可重复读
			 */
			
			//b 更新
			pstat = conn.prepareStatement("update books set price=price+10 where code='qqq'");
			pstat.executeUpdate();
			close();
			//c 查询
			pstat = conn.prepareStatement("select price from books where code='qqq'");
			rs = pstat.executeQuery();
			while(rs.next()){
				//输出 还是price:25.0 ,因为B事务的干预
				System.out.println("price:"+rs.getDouble(1));
			}
			close();
			//提交事务
			conn.commit();
			if(conn != null){
				conn.close();
			}

上面执行的顺序,
事务B是在A的执行过程中执行的
  • 大小: 8 KB
0
0
分享到:
评论

相关推荐

    oracle 数据库隔离级别学习

    oracle 事务隔离级别 事务不同引发的状况: 脏读(Dirty reads) 一个事务读取另一个事务尚未提交的修改时,产生脏读 很多数据库允许脏读以避免排它锁的竞争。 不可重复读(Nonrepeatable reads) 同一查询在同一事务中...

    数据库事务隔离级别

    介绍数据库事务的四种隔离级别,比较不同隔离级别的区别和影响

    数据库事务和隔离级别

    数据库事务和隔离级别

    ORACLE的隔离级别

    隔离级别定义了事务与事务之间的隔离程度。 隔离级别与并发性是互为矛盾的:隔离程度越高,数据库的并发性越差;隔离程度越低,数据库的并发性越好。

    ORACLE数据库事务隔离级别介绍

    两个并发事务同时访问数据库表相同的行时,可能存在以下三个问题: 1、幻想读:事务T1读取一条指定where条件的语句,返回结果集。此时事务T2插入一行新记录,恰好满足T1的where条件。然后T1使用相同的条件再次查询,...

    Oracle数据库、SQL

    17.4事务的隔离级别 35 17.5数据库开发的关键挑战 35 17.6锁的概念 36 17.7 Oracle的锁机制 36 17.8事务不提交的后果 36 17.9回滚事务rollback 36 17.10保留点savepoint 36 十八、 数据库对象:视图view 37 18.1带子...

    构建最高可用Oracle数据库系统 Oracle 11gR2 RAC管理、维护与性能优化

    5.1.4 Oracle事务隔离级别 5.1.5锁管理器 5.2 RAC资源的协调和管理 5.2.1 Cache Fusion的结构 5.2.2 Cache Fusion工作原理 5.2.3 GES全局控制 5.3 RAC并发与一致性 5.3.1 DLM锁管理器 5.3.2多版本数据块 ...

    四种隔离级别与锁

    数据库事务的四种隔离级别的特点描述,他们的使用热度,以及各种锁在隔离级别下的释放时机。

    oracle隔离级别

    oracle并发和数据一致性的相关内容,针对数据库支持的4种隔离级别的说明

    数据库事务与隔离技术

    通过此文档,让你完全了解数据库事务与隔离技术,SQL SERVER,ORACLE在不同事务隔离级别的区别,以及两种数据库本身的特点

    MSSQL与Oracle数据库事务隔离级别与锁机制对比

    事务隔离级别是并发控制的整体解决方案,其实际上是综合利用各种类型的锁和行版本控制,来解决并发问题。锁是数据库并发控制的内部机制,是基础。对用户来说,只有当事务隔离级别无法解决一些并发问题和需求时,才有...

    Oracle 12c数据库新特性之多租户容器数据库

    多租户容器数据库是指Oracle数据库管理模型的一种革新,它引入了容器数据库(CDB)和租户数据库(PDB)的概念。通过CDB和PDB模型,可以在一个数据库实例中同时管理多个独立的数据库,这些数据库彼此隔离,但又能共享...

    韩顺平 玩转Oracle 10g实战教程全套PPT

    Oracle中事务处理 –事务隔离级别 oracle的事务隔离级别 ORACLE提供了SQL92标准中的read committed和serializable,同时提供了非SQL92标准的read-only ◆ oracle的 read committed 说明: ①这是ORACLE缺省的...

    数据库常见面试题

    2、Mysql提供了哪几种事务隔离级别? 3、MySQL中varchar与char的区别以及varchar(50)中的50代表的涵义? 4、date,datetime和timestamp数据类型有什么区别? 5、union 与union all的区别? 6、简述Mysql几种Join的...

    数据库系统-招标参数---模板.doc

    另一个是新事务隔离级别(快照),增强系统" " " "的并发管理 " " " "支持在同一个硬件服务器上运行多个数据库实例 " " " "支持同一个实例上运行多个数据库,同一管理控制" " " "台完成所有管理工作,工具易于理解、...

    通过实例分析MySQL中的四种事务隔离级别

    在数据库操作中,为了有效保证并发读取数据的正确性,提出的事务隔离级别。数据库事务的隔离级别有4个,下面话不多说了,来一起看看详细的介绍吧。 数据库事务有四种隔离级别: 未提交读(Read Uncommitted):允许脏...

Global site tag (gtag.js) - Google Analytics