家政网站制作,网站建设公司客户开发手册,Wordpress api开发,编程软件排行榜一致性读是oracle区别于其他数据库的重要特点之一#xff0c;但一般来说#xff0c;这个一致性读是sql级别的#xff0c;只针对单个sql有效。由于业务逻辑需要#xff0c;我们可能需要在一个事务中的多个sql也能实现读一致性#xff0c;也就是说#xff0c;数据源在事务开…一致性读是oracle区别于其他数据库的重要特点之一但一般来说这个一致性读是sql级别的只针对单个sql有效。由于业务逻辑需要我们可能需要在一个事务中的多个sql也能实现读一致性也就是说数据源在事务开始时就定下来了不受其他会话影响。oracle的只读事务可以实现这个功能它可以在事务级别上实现读一致性。看下面的实验SQL select * from t1;ID---------------------------------------1SQL set serverout onSQLSQL 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 id2;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 id3;1 row updatedSQL commit;Commit complete--以下是输出结果22可以看到虽然第二次读取t1表的数据前已经有其他会话修改并提交了t1表的数据但第二次得到的结果仍然是2.这就是只读事务的功能它在整个事务中保证一致性读在整个事务中的数据在事务开始时就决定即使有其他会话在事务周期内修改并提交数据也不会影响事务。可以认为在只读事务周期内其他事务的对数据的改变就像不存在一样。在显式提交或者回滚后、或执行ddl后结束只读事务。需要注意因为只读事务的原理是读取undo中数据的前镜像来实现一致性读的所以只读事务运行时间不能过长否则会报0ra-01555。还有一点只读事务下是不能对数据做修改的sukORA10G set transaction read only;事务处理集。sukORA10G delete from test;delete from test*第 1 行出现错误:ORA-01456: 不能在 READ ONLY 事务处理中执行插入/删除/更新操作