只读事务
发布日期:2021-09-16 12:19:56
浏览次数:5
分类:技术文章
本文共 1667 字,大约阅读时间需要 5 分钟。
转:http://blog.sina.com.cn/s/blog_b0f182290101dofh.html
一致性读是oracle区别于其他数据库的重要特点之一,但一般来说,这个一致性读是sql级别的,只针对单个sql有效。
由于业务逻辑需要,我们可能需要在一个事务中的多个sql实现读一致性,也就是说,数据源在事务开始时就定下来了,不受其他会话影响。如:机票代售点每天18点开始统计一天的销售情况,此时就可以使用只读事务。oracle的只读事务可以实现这个功能,它可以在事务级别上实现读一致性。看下面的实验:
SQL> select * from t1; ID --------------------------------------- 1 SQL> set serverout on SQL> SQL> create or replace procedure p_test is 2 l_id int; 3 begin 4 select id into l_id from t1; 5 dbms_output.put_line(l_id); 6 dbms_lock.sleep(15); 7 select id into l_id from t1; 8 dbms_output.put_line(l_id); 9 end p_test; 10 / Procedure created SQL> exec p_test; --在p_test运行期间(执行dbms_lock.sleep时),修改t1的数据: SQL> update t1 set id=2; 1 row updated SQL> commit; Commit complete --以下是输出结果 1 2 可以看到,由于第二次读取t1表的数据时,由于有其他会话修改并提交了t1表的数据,所以第二次得到的结果是2. 我们对这个p_test做一个简单的修改,设置只读事务: SQL> create or replace procedure p_test is 2 l_id int; 3 begin 4 set transaction read only; 5 select id into l_id from t1; 6 dbms_output.put_line(l_id); 7 dbms_lock.sleep(15); 8 select id into l_id from t1; 9 dbms_output.put_line(l_id); 10 end p_test; 11 / Procedure created SQL> exec p_test; --在p_test运行期间(执行dbms_lock.sleep时),修改t1的数据: SQL> update t1 set id=3; 1 row updated SQL> commit; Commit complete --以下是输出结果 2 2 可以看到,虽然第二次读取t1表的数据前,已经有其他会话修改并提交了t1表的数据,但第二次得到的结果仍然是2. 这就是只读事务的功能,它在整个事务中保证一致性读:在整个事务中的数据在事务开始时就决定,即使有其他会话在事务周期内修改并提交数据,也不会影响事务。可以认为在只读事务周期内,其他事务的对数据的改变就像不存在一样。在显式提交或者回滚后、或执行ddl后,结束只读事务。
需要注意:因为只读事务的原理是读取undo中数据的前镜像来实现一致性读的,所以,只读事务运行时间不能过长,否则会报0ra-01555。还有一点,只读事务下是不能对数据做修改的:
suk@ORA10G> set transaction read only; 事务处理集。 suk@ORA10G> delete from test; delete from test * 第 1 行出现错误: ORA-01456: 不能在 READ ONLY 事务处理中执行插入/删除/更新操作转载地址:https://blog.csdn.net/wxwzy738/article/details/43277495 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
能坚持,总会有不一样的收获!
[***.219.124.196]2024年04月07日 03时00分33秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
为什么使用 MD5 存储密码非常危险
2019-04-27
美团点评实时数仓实践
2019-04-27
Guava学习之Lists
2019-04-27
安装JUDDI服务器以及发布WSDL:第二部分,发布WSDL
2019-04-27
一文彻底搞懂令人疑惑的Java和JDK的版本命名!
2019-04-27
listview学习之simpleadapter详细介绍
2019-04-27
【Unity3D】 灯光学习
2019-04-27
Python3《机器学习实战》学习笔记(三):决策树实战篇之为自己配个隐形眼镜
2019-04-27
学生成绩信息管理c++
2019-04-27
Qt网络编程———TCP(1)
2019-04-27
java 构造方法中super()和this()
2019-04-27
华为HCIA-datacom 学习笔记汇总目录
2019-04-27
第4章 Python 数字图像处理(DIP) - 频率域滤波1 - 傅里叶级数和变换简史
2019-04-27
v-if和v-show的区别
2019-04-27
Linux下创建用户,分组,配置jdk, tomcat
2019-04-27
HikariCP、MySQL Configuration 性能优化
2019-04-27
系统配置自动装载机制 - 分布式开发
2019-04-27
SpringCloud实战 - Hystrix
2019-04-27