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 事務處理中執行插入/刪除/更新操作
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/231499/viewspace-63853/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Spring的事務管理(一) Spring事務管理的實現,事務的屬性(隔離級別,傳播行為,只讀)Spring
- Oracle建立只讀使用者Oracle
- oracle 中的事務Oracle
- oracle事務Oracle
- 2.2.3 關於配置Oracle-Home只讀模式Oracle模式
- 管理(006):啟用只讀Oracle Home目錄Oracle
- 淺談ORACLE的分散式事務Oracle分散式
- 【ORACLE21C】Oracle21c 只讀目錄說明Oracle
- 使用Spring實現訪問主從資料庫的讀寫和只讀事務/事物的分離路由 -Vlad MihalceaSpring資料庫路由
- 關於事務、事務的隔離級別以及對髒讀、不可重複讀、幻讀的理解
- Oracle 巢狀事務 VS 自治事務Oracle巢狀
- 原創:oracle 事務總結Oracle
- Oracle 11g 新特性:只讀表(Read-only)Oracle
- MySQL事務(4種事務隔離級別、髒寫、髒讀、不可重複讀、幻讀、當前讀、快照讀、MVCC、事務指標監控)MySqlMVC指標
- [20200512]oracle的事務隔離級別.txtOracle
- 深入理解oracle的事務隔離性Oracle
- [轉帖]帶你讀懂Spring 事務——事務的傳播機制Spring
- Oracle面試寶典-事務篇Oracle面試
- Spring事務原始碼解讀Spring原始碼
- 查詢oracle正在執行的SQL和事務OracleSQL
- Oracle 18c - 配置只讀 OracleHome / DBCA / Patching / Upgrade (文件 ID 2469646.1)Oracle
- MySQL事務(二)事務隔離的實現原理:一致性讀MySql
- 分散式事務,只看這一篇就夠了分散式
- Oracle分散式事務典型案例處理Oracle分散式
- Oracle vs PostgreSQL,研發注意事項(6)- 事務處理OracleSQL
- 關於ORACLE大型事務回滾的幾個點Oracle
- PHP 微服務之【分散式事務】閱讀提示PHP微服務分散式
- PHP 微服務之 [分散式事務] 閱讀提示PHP微服務分散式
- 【Mysql】資料庫事務,髒讀、幻讀、不可重複讀MySql資料庫
- oracle分散式事務異常處理方法Oracle分散式
- oracle資料庫事務transaction 不同的鎖lock型別Oracle資料庫型別
- 髒讀!幻讀!不可重複讀!mysql併發事務引發的問題MySql
- 只讀表空間
- 解讀mysql的索引和事務的正確姿勢MySql索引
- Oracle vs PostgreSQL,研發注意事項(2)-DDL語句與事務OracleSQL
- ORACLE事務和例項恢復過程梳理Oracle
- ORACLE懸疑分散式事務問題處理Oracle分散式
- Oracle使用*的注意事項Oracle