oracle模拟重叠事务,ORACLE的事务读一致性与语句读一致性
SET TRANSACTION READ ONLY來實現事物級別的一致性。一個事物所有語句讀到的數據都是一致的。
我們開始試驗一,模擬語句級別讀一致性。第一個session使用顯示打開一個游標模擬數據讀,同時在游標讀數據的過程中,啟動另外一個session更改數據,我可以看到另外一個session對數據的更改,并不會改變到第一個session的讀。這就是語句級別的讀一致性。啟動一個session連接數據庫:Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.1.0Connected as cboSQL> set serveroutput on;SQL>SQL> create table test(id number,name varchar2(10));Table createdSQL> insert into test values(1,'a');1 row insertedSQL> insert into test values(2,'b');1 row insertedSQL> commit;Commit completeSQL>SQL> declare2? cursor cur is select * from test;3? begin4? for rec in cur5? loop6?? dbms_output.put_line(rec.name);7?? dbms_lock.sleep(10);--中間等待另外一個session啟動并執行更新數據操作8? end loop;9? end;10? /abPL/SQL procedure successfully completedSQL>在執行游標打印輸出的時候同時啟動另外一個進程,執行更新數據操作:Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.1.0Connected as cboSQL> set serveroutput on;SQL>SQL> create table test(id number,name varchar2(10));Table createdSQL> insert into test values(1,'a');1 row insertedSQL> insert into test values(2,'b');1 row insertedSQL> commit;Commit completeSQL>SQL> declare2? cursor cur is select * from test;3? begin4? for rec in cur5? loop6?? dbms_output.put_line(rec.name);7?? dbms_lock.sleep(10);8? end loop;9? end;10? /abPL/SQL procedure successfully completedSQL>
下面我們開始試驗二,模擬事務級別讀一致性。
首先啟動一個SESSION,讀一次數據:
SQL> SET TRANSACTION READ ONLY;
Transaction set
SQL> select * from test;
ID NAME
---------- ----------
1 a
2 bbbb
接下來我們啟動另外一個session,執行更新數據操作:
SQL> update test set name='123456';
2 rows updated
SQL> commit;
Commit complete
最后我們回到第一session查看再次查看數據:
SQL> select * from test;
ID NAME
---------- ----------
1 a
2 bbbb
我們會發現讀出的數據并沒有發生改變。所以在設置了SET TRANSACTION READ ONLY后,一個事務前后語句讀取的數據不會因為其他seesion對數據的更新而改變。
另外SET TRANSACTION READ ONLY是有一定的條件限制的,官方文檔說明如下:
TheSETTRANSACTIONstatement must be the
first statement of a new transaction; if any DML statements (including
queries) or other non-DDL statements (such asSET ROLE) precede aSET TRANSACTIONREADONLYstatement, an error is returned. Once aSETTRANSACTIONREADONLYstatement successfully executes, onlySELECTFORUPDATEclause),COMMIT,ROLLBACK, or non-DML statements (such asSETROLE,ALTERSYSTEM,LOCKTABLE) are allowed in the transaction. Otherwise, an error is returned. ACOMMIT,ROLLBACK,
or DDL statement terminates the read-only transaction; a DDL statement
causes an implicit commit of the read-only transaction and commits in
its own transaction.
總結
以上是生活随笔為你收集整理的oracle模拟重叠事务,ORACLE的事务读一致性与语句读一致性的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 共享充电宝APP小程序开发解决方案
- 下一篇: jitter 如何优化网络_网络推广如何