設定transaction的讀寫屬性與隔離級別
背景知識:
Oracle提供了set transaction read only/read write來設定事務的讀寫屬性;
Set transaction isolation level serializable/read commited來設定事務的隔離級別
測試內容:
對於上述四項設定,結合部分例項加以說明
【Set transaction read only】
必須是transaction的頭一條命令,否則會收到” ORA-01453: SET TRANSACTION must be first statement of transaction”。提供了transaction-level read consistency,適合於對時間點一致性要求非常高的場景,整個transaction過程中看到的是執行set transaction read only命令所對應的scn時間點已經提交的內容;不能使用除了lock table,alter system,alter session,set role之外的語句。
【Set transaction read write】
Oracle預設的transaction屬性,提供了statement-level read consistency
【Set transaction isolation level serializable】
序列級別的事務隔離,和set transaction read only一樣,提供了transaction-level read consistency,區別是transaction裡可以執行DML語句,在設定了Set transaction isolation level serializable後不能再設定Set transaction read only,否則會產生ORA-01453錯誤。要在serializable transaction裡成功執行DML必須滿足如下條件:
Serializable級別的transaction要更改的記錄從transaction開始前必須處於commited狀態,且從那一刻一直到serializable transaction更改這條記錄期間不能有其它transaction更改這條記錄,否則會出現鎖等待(適用於serializable transaction開始前其它transaction已經對這條記錄進行了更改卻一直未能commit的情況)或者收到ORA-08177: can't serialize access for this transaction(適用於serializable transaction開始前其它transaction已經對這條記錄進行了更改,並在serializable transaction更改前其它transaction進行了commit的場景,或者其它transaction 對這條記錄的更改與提交操作晚於serializable transaction的開始時間但早於serializable transaction更改記錄的時間)。對於ORA-08177的報錯情況分為以下兩種:
(1) 早於serialization transaction開始前其它session已經更改但未提交,在serialization transaction更改前其它Session進行了提交
--T1時刻
Session 1:
SQL> select * from emp1 where empno=7934;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
7934 D CLERK 7782 23-JAN-82 1300 10
--不提交
Update emp1 set ename='E' where empno=7934;
select * from emp1 where empno=7934;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
7934 E CLERK 7782 23-JAN-82 1300 10
--T2時刻(T2>T1)
Session 2:
Set transaction isolation level serializable;
--T3時刻(T3>T2)
Session 1:
Commit;
select * from emp1 where empno=7934;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
7934 E CLERK 7782 23-JAN-82 1300 10
--T4時刻(T4>T3)
Session 2:
select * from emp1 where empno=7934;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
7934 D CLERK 7782 23-JAN-82 1300 10
SQL> Update emp1 set ename='E' where empno=7934;
Update emp1 set ename='E' where empno=7934
*
ERROR at line 1:
ORA-08177: can't serialize access for this transaction
(2) serialization transaction開始後其它session更改,且在serialization transaction更改前其它Session進行了提交
--T1時刻
Session 1:
SQL> select * from emp1 where empno=7934;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
7934 E CLERK 7782 23-JAN-82 1300 10
set transaction isolation level serializable;
SQL> select * from emp1 where empno=7934;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
7934 E CLERK 7782 23-JAN-82 1300 10
--T2時刻(T2>T1)
Session 2:
SQL> select * from emp1 where empno=7934;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
7934 E CLERK 7782 23-JAN-82 1300 10
update emp1 set ename='F' where empno=7934;
commit;
SQL> select * from emp1 where empno=7934;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
7934 F CLERK 7782 23-JAN-82 1300 10
--T3時刻(T3>T2)
Session 1:
SQL> select * from emp1 where empno=7934;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
7934 E CLERK 7782 23-JAN-82 1300 10
SQL> update emp1 set ename='F' where empno=7934;
update emp1 set ename='F' where empno=7934
*
ERROR at line 1:
ORA-08177: can't serialize access for this transaction
【Set transaction isolation level read commited】
此為oracle中預設採用的狀態,提供了statement-level read consistency
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/53956/viewspace-1286315/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- spring事物屬性與隔離級別Spring
- MySQL設定隔離級別MySql
- golang saas框架,資料庫級別隔離、讀寫分離Golang框架資料庫
- oracle事務隔離級別transaction isolation level初識Oracle
- Postgresql 的預設隔離級別SQL
- ORACLE的隔離級別Oracle
- MySQL的隔離級別MySql
- Mysql 隔離級別MySql
- Mysql鎖與事務隔離級別MySql
- 【實驗】Oracle的serializable隔離性級別影響Oracle
- oracle資料庫事務不同事務隔離級別與v$transaction flag列思考Oracle資料庫
- SqlServer事務詳解(事務隔離性和隔離級別詳解)SQLServer
- oracle不同的事務transaction隔離級別isolation level進一步理解Oracle
- 事務隔離級別讀書筆記分享筆記
- 事務ACID特性與隔離級別
- 資料庫事務與隔離級別資料庫
- oracle資料庫事務transaction隔離級別isolation level的選擇依據Oracle資料庫
- [golang]MySQL中如何為單個事務設定隔離級別GolangMySql
- 【資料庫】網易校園招聘筆試題--資料庫事務的定義,屬性,以及隔離級別資料庫筆試
- MySQL事務的隔離級別MySql
- MySQL的事務隔離級別MySql
- MySQL 的隔離級別 自理解MySql
- Oracle的隔離級別(Isolation Level)Oracle
- MySQL 事務隔離級別MySql
- PostgreSQL事務隔離級別SQL
- 事務、特性、隔離級別
- MySQL入門--隔離級別MySql
- oracle隔離級別深究追根Oracle
- 資料庫隔離級別資料庫
- MySQL事務隔離級別MySql
- [Mysql]事務/隔離級別MySql
- Mysql事務隔離級別與鎖機制MySql
- 資料庫ACID、隔離級別與MVCC資料庫MVC
- Linux命令:MySQL系列之九–MySQL隔離級別及設定薦LinuxMySql
- 為什麼mysql選可重複讀作為預設的隔離級別MySql
- JDBC 大資料集分頁 ,大資料讀寫及事務的隔離級別JDBC大資料
- 資料庫事務與事務的隔離級別資料庫
- MySQL事務的隔離級別與併發問題MySql