Oracle 只读事物
来源:互联网 发布:知乎snh48 编辑:程序博客网 时间:2024/05/01 05:43
一致性读是oracle区别于其他数据库的重要特点之一,但一般来说,这个一致性读是sql级别的,只针对单个sql有效。
由于业务逻辑需要,我们可能需要在一个事务中的多个sql也能实现读一致性,也就是说,数据源在事务开始时就定下来了,不受其他会话影响。oracle的只读事务可以实现这个功能,它可以在事务级别上实现读一致性。
看下面的实验:
SQL> select * from t1;ID---------------------------------------1SQL> set serverout onSQL> SQL> create or replace procedure p_test is2 l_id int;3 begin4 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 createdSQL> exec p_test;--在p_test运行期间(执行dbms_lock.sleep时),修改t1的数据:SQL> update t1 set id=2;1 row updatedSQL> commit;Commit complete--以下是输出结果12
可以看到,由于第二次读取t1表的数据时,由于有其他会话修改并提交了t1表的数据,所以第二次得到的结果是2.
对这个p_test做一个简单的修改,设置只读事务:
SQL> create or replace procedure p_test is2 l_id int;3 begin4 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 createdSQL> exec p_test;--在p_test运行期间(执行dbms_lock.sleep时),修改t1的数据:SQL> update t1 set id=3;1 row updatedSQL> commit;Commit complete--以下是输出结果22
可以看到,虽然第二次读取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 事务处理中执行插入/删除/更新操作
- Oracle 只读事物
- Oracle事物
- Oracle事物
- Oracle事物
- Oracle 事物
- Oracle事物
- Oracle 事物
- 只读权限oracle用户
- oracle 只读事务
- oracle只读事务
- Oracle只读表空间
- oracle只读模式
- Oracle 数据库文件只读
- Oracle只读表
- oracle 自治事物
- oracle 自治事物
- oracle中的事物
- oracle触发器和事物
- 数组、链表、哈希……Qt中丰富的容器类
- Android深入浅出之Binder机制
- (《Linux环境下C语言编程指南》学习笔记二)C语言中进程的创建(fork和vfork函数的异同)
- 将给定数组reverse
- 王晓东 独立任务最优调度问题
- Oracle 只读事物
- Service 创建windows服务应用程序
- 阻塞如何跟踪和查找; 如何 处理阻塞
- CString 操作指南
- C#数据库数据导入导出系列之二 数据库导出到Excel上
- 安馨园集团表示愿意接手 把浐灞队留在西安
- Windows下Djang+Wsgi+Apache配置,各种该相关配置问题的终极解决方案
- Sql批量建表、删表,表名以数字命名,且固定长度
- 第11章 使用正则表达式的模式匹配(二)