ORACLE資料庫事務隔離級別
事務隔離級別:一個事務對資料庫的修改與並行的另一個事務的隔離程度。
兩個併發事務同時訪問資料庫表相同的行時,可能存在以下三個問題:
1、幻想讀:事務T1讀取一條指定where條件的語句,返回結果集。此時事務T2插入一行新記錄,恰好滿足T1的where條件。然後T1使用相同的條件再次查詢,結果集中可以看到T2插入的記錄,這條新紀錄就是幻想。
2、不可重複讀取:事務T1讀取一行記錄,緊接著事務T2修改了T1剛剛讀取的記錄,然後T1再次查詢,發現與第一次讀取的記錄不同,這稱為不可重複讀。
3、髒讀:事務T1更新了一行記錄,還未提交所做的修改,這個T2讀取了更新後的資料,然後T1執行回滾操作,取消剛才的修改,所以T2所讀取的行就無效,也就是髒資料。
為了處理這些問題,SQL標準定義了以下幾種事務隔離級別
READ UNCOMMITTED 幻想讀、不可重複讀和髒讀都允許。
READ COMMITTED 允許幻想讀、不可重複讀,不允許髒讀
REPEATABLE READ 允許幻想讀,不允許不可重複讀和髒讀
SERIALIZABLE 幻想讀、不可重複讀和髒讀都不允許
Oracle資料庫支援READ COMMITTED 、SERIALIZABLE兩種事務隔離級別。
SQL標準所定義的預設事務隔離級別是SERIALIZABLE,但是Oracle 預設使用的是READ COMMITTED
設定隔離級別使用 SET TRANSACTION ISOLATION LEVEL [READ COMMITTED|SERIALIZABLE]
也可以在session級設定ISOLATION LEVEL:
ALTER SESSION SET ISOLATION_LEVEL = {SERIALIZABLE | READ COMMITTED}
READ COMMITTED級別是預設的,不深入討論,這裡我們實驗一下在SERIALIZABLE隔離級別下資料庫行為是什麼樣的
當前資料:
SQL> SELECT * FROM TEST2;
ID
----------
1
2
4
session1下執行:
SQL> alter session SET ISOLATION_level=SERIALIZABLE;
Session altered.
SQL> select * from test2;
ID
----------
1
2
4
session2下執行:
SQL> delete test2 where id =1 ;
1 row deleted.
SQL> commit;
Commit complete.
SQL> select * from test2;
ID
----------
2
4
回到session2再次執行前面的query:
SQL> select * from test2;
ID
----------
1
2
4
結果沒有變,與上次查詢的結果一樣。
嘗試在session2中刪除id=1的記錄會發生什麼情況:
SQL> delete from test2 where id =1;
delete from test2 where id =1
*
ERROR at line 1:
ORA-08177: can't serialize access for this transaction
報錯資訊已經提示的很明顯了
原因:更新行已經在其他的會話中進行了修改,版本不一致
參考:http://www.cnblogs.com/jackal/archive/2011/02/14/1954231.html
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/195110/viewspace-717924/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Oracle資料庫事務隔離級別概述Oracle資料庫
- 資料庫事務隔離級別資料庫
- 資料庫事務與隔離級別資料庫
- 資料庫事務及其隔離級別資料庫
- 資料庫事務與事務的隔離級別資料庫
- 聊聊資料庫的事務隔離級別資料庫
- [資料庫]事務的4種隔離級別資料庫
- MySQL資料庫引擎、事務隔離級別、鎖MySql資料庫
- 資料庫事務隔離級別分析----轉載資料庫
- 資料庫事務的四種隔離級別資料庫
- Oracle-事務隔離級別Oracle
- 資料庫系列:事務的4種隔離級別資料庫
- 資料庫事務隔離資料庫
- 資料庫事務與隔離級別示例(oracle與sql server對比)資料庫OracleSQLServer
- oracle資料庫事務不同事務隔離級別與v$transaction flag列思考Oracle資料庫
- 檢視ORACLE事務隔離級別方法Oracle
- 資料庫事務的四大特性以及事務的隔離級別資料庫
- MySQL 事務隔離級別MySql
- PostgreSQL事務隔離級別SQL
- 事務、特性、隔離級別
- MySQL事務隔離級別MySql
- [Mysql]事務/隔離級別MySql
- oracle資料庫事務transaction隔離級別isolation level的選擇依據Oracle資料庫
- 成為MySQL DBA後,再看ORACLE資料庫(十、事務與隔離級別)MySqlOracle資料庫
- 資料庫隔離級別資料庫
- 資料庫事務的隔離級別及四大特性資料庫
- 資料庫事務的四大特性和隔離級別資料庫
- 關係型資料庫的四種事務隔離級別資料庫
- KES資料庫實踐指南:探索KES資料庫的事務隔離級別資料庫
- 檢視oracle資料庫session事務設定的是哪個隔離級別Oracle資料庫Session
- MySQL事務的隔離級別MySql
- MySQL的事務隔離級別MySql
- 理解MySQL事務隔離級別MySql
- mysql修改事務隔離級別MySql
- JDBC 事務(一) 隔離級別JDBC
- 資料庫學習筆記:事務的特性和隔離級別資料庫筆記
- 資料庫事務併發產生的問題以及事務的隔離級別資料庫
- SqlServer事務詳解(事務隔離性和隔離級別詳解)SQLServer