oracle 数据库隔离级别学习建站知识
导读:1建站知识这篇文章主要介绍了oracle数据库的隔离级别相关的知识,数据库操作的隔离级别,有需要的朋友可以参考下网站建设网站seo优化课程。
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)三条语句
声明: 本文由我的SEOUC技术文章主页发布于:2023-05-22 ,文章oracle 数据库隔离级别学习建站知识主要讲述级别,标签,oracle 数据库隔离级别学习建站知识1网站建设源码以及服务器配置搭建相关技术文章。转载请保留链接: https://www.seouc.com/article/web_4420.html