oracle唯讀事務

2021-08-27 10:52:22 字數 1971 閱讀 8981

一致性讀是oracle區別於其他資料庫的重要特點之一,但一般來說,這個一致性讀是sql級別的,只針對單個sql有效。

由於業務邏輯需要,我們可能需要在乙個事務中的多個sql也能實現讀一致性,也就是說,資料來源在事務開始時就定下來了,不受其他會話影響。oracle的唯讀事務可以實現這個功能,它可以在事務級別上實現讀一致性。

看下面的實驗:

sql> select * from t1;

id---------------------------------------

1sql> 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

--以下是輸出結果12

可以看到,由於第二次讀取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

--以下是輸出結果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 事務處理中執行插入/刪除/更新操作

事務 唯讀事務

b 沒有事務 b 保證了sql語句級別的讀一致性。即在一條sql語句執行期間,它只會看到執行前點的資料狀態,而不會看到執行期間資料被其他sql改變的狀態。存在的問題 比如你做乙個報表查詢,在執行完第一條sql的時候,執行第二條查詢sql,而這個之間有資料被改變了,第二條資料查詢就有可能不一致 b 唯...

DM7唯讀會話與oracle唯讀事務

dm7的唯讀會話與oracle的唯讀事務有一定區別 乙個是會話級別,乙個是事務級別。dm7會話設定為唯讀,只是禁止當前會話修改資料,oracle將事務設定為唯讀,可以影響到資料的隔離級。在dm7中當sp set session readonly 1 後 create table t1 c1 int ...

mysql 設定唯讀事務 Spring 唯讀事務

transactional readonly true 這東西不叫唯讀事務,它只是建立了乙個唯讀的資料庫連線。transactional裡面還有個引數,叫isolation這個才是控制隔離級別的。spring提供了5種事務隔離級別予以解決 1 default預設級別 default為資料來源 資料庫...