oracle只读事物,oracle的只读事务
一致性讀是oracle區(qū)別于其他數(shù)據(jù)庫的重要特點之一,但一般來說,這個一致性讀是sql級別的,只針對單個sql有效。
由于業(yè)務邏輯需要,我們可能需要在一個事務中的多個sql也能實現(xiàn)讀一致性,也就是說,數(shù)據(jù)源在事務開始時就定下來了,不受其他會話影響。oracle的只讀事務可以實現(xiàn)這個功能,它可以在事務級別上實現(xiàn)讀一致性。
看下面的實驗:
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運行期間(執(zhí)行dbms_lock.sleep時),修改t1的數(shù)據(jù):
SQL> update t1 set id=2;
1 row updated
SQL> commit;
Commit complete
--以下是輸出結果
1
2
可以看到,由于第二次讀取t1表的數(shù)據(jù)時,由于有其他會話修改并提交了t1表的數(shù)據(jù),所以第二次得到的結果是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運行期間(執(zhí)行dbms_lock.sleep時),修改t1的數(shù)據(jù):
SQL> update t1 set id=3;
1 row updated
SQL> commit;
Commit complete
--以下是輸出結果
2
2
可以看到,雖然第二次讀取t1表的數(shù)據(jù)前,已經(jīng)有其他會話修改并提交了t1表的數(shù)據(jù),但第二次得到的結果仍然是2.
這就是只讀事務的功能,它在整個事務中保證一致性讀:在整個事務中的數(shù)據(jù)在事務開始時就決定,即使有其他會話在事務周期內修改并提交數(shù)據(jù),也不會影響事務。可以認為在只讀事務周期內,其他事務的對數(shù)據(jù)的改變就像不存在一樣。
在顯式提交或者回滾后、或執(zhí)行ddl后,結束只讀事務。需要注意:因為只讀事務的原理是讀取undo中數(shù)據(jù)的前鏡像來實現(xiàn)一致性讀的,所以,只讀事務運行時間不能過長,否則會報0ra-01555。
還有一點,只讀事務下是不能對數(shù)據(jù)做修改的:
suk@ORA10G> set transaction read only;
事務處理集。
suk@ORA10G> delete from test;
delete from test
*
第 1 行出現(xiàn)錯誤:
ORA-01456: 不能在 READ ONLY 事務處理中執(zhí)行插入/刪除/更新操作
總結
以上是生活随笔為你收集整理的oracle只读事物,oracle的只读事务的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Nacos配置文件覆盖问题
- 下一篇: ocp oracle 考试报名_获得Or