zoukankan      html  css  js  c++  java
  • oracle 只读事务 (转载)

    一致性读是oracle区别于其他数据库的重要特点之一,但一般来说,这个一致性读是sql级别的,只针对单个sql有效。
    由于业务逻辑需要,我们可能需要在一个事务中的多个sql也能实现读一致性,也就是说,数据源在事务开始时就定下来了,不受其他会话影响。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 事务处理中执行插入/删除/更新操作

  • 相关阅读:
    POJ 2955 Brackets 区间DP
    POJ 3311 Hie with the Pie 最短路+状压DP
    POJ 3615 Cow Hurdles(最短路径flyod)
    hdu 3790 最短路径dijkstra(多重权值)
    poj 3254 Corn Fields 状压DP
    状压DP
    poj2411 Mondriaan's Dream 状压DP
    M: Mysterious Conch 字符串哈希
    哈希(hash)理解
    域渗透:GPP(Group Policy Preferences)漏洞
  • 原文地址:https://www.cnblogs.com/haibin168/p/1907407.html
Copyright © 2011-2022 走看看