Oracle資料庫事務隔離級別概述
整理自Oracle 11g R2 官方文件 《concepts》
001 概述
Oracle資料庫提供如下事務隔離級別:
·已提交讀隔離級別
·可序列化隔離級別
·只讀隔離級別
002 讀提交隔離級別
2-1 概述
2-1 概述
在(預設的)已提交讀隔離級別中,事務中執行的每個查詢,僅看到在查詢 開始之前提交的資料——而不是事務開始之前提交的資料。這一隔離級別適合於幾乎不可能發生事務衝突的資料庫環境。
已提交讀事務中的查詢可以避免讀取在查詢過程中所提交的資料。例如,如 果一個查詢正掃描到一個百萬行表的中間,而另一個不同的事務對第950000行提交了一個更新,但當查詢讀到第 950000行時,它並不能看見這個變化。但是,因為資料庫不會阻止其它事務修改一個查詢所讀取的數據,其他事務可能會在查詢執行期間更改資料。因此,兩次執行相同查詢的事務可能會遇到模糊讀取和幻像讀取現象。
2-2 在已提交讀隔離級別中的讀取一致性
為每個查詢提供一個一致的結果集,其目的是為了保證資料一致性,而無需 使用者採取任何行動。對於隱含的查詢(如在一個UPDATE語句中的WHERE子句), 也同樣可以保證其一致的結果集。但是,在隱式查詢中的每個語句不會看到 DML 語句本身所做的更改,只能看到更改之前所存在的資料。
2-2 在已提交讀隔離級別中的讀取一致性
為每個查詢提供一個一致的結果集,其目的是為了保證資料一致性,而無需 使用者採取任何行動。對於隱含的查詢(如在一個UPDATE語句中的WHERE子句), 也同樣可以保證其一致的結果集。但是,在隱式查詢中的每個語句不會看到 DML 語句本身所做的更改,只能看到更改之前所存在的資料。
如果 SELECT 列表中包含一個PL/SQL 函式,則資料庫在該PL/SQL 函式代碼內執行的SQL所在語句級別(而不是在父SQL 級別)上,應用語句級別讀取一致性。例如,一個函式可能會訪問某個表,其資料被另一個使用者更改並提交。在 SELECT語句中的每次函式執行,都會建立一個新的讀一致性快照。
2-3 在讀提交事務中的寫入衝突
在一個讀已提交事務中,當事務嘗試更改由另一個未提交併發事務(有時稱 為阻塞事務)所更新的行時,會發生寫入衝突。讀提交事務將等待阻塞事務結束並釋放其行鎖。有兩個選項如下所示:
·如果阻塞事務回滾,正在等待的事務將繼續並更改之前被鎖定的行,就像另一個事務從未存在一樣。
·如果阻塞事務提交併釋放了鎖,則正在等待的事務將對這個剛被更新的行繼續其預定更新。
003 可序列化隔離級別
在可序列化隔離級別,事務只看到自事務開始以來(而不是自查詢以來)該 事務本身所提交的更改。可序列化事務的執行環境,使其看起來好像沒有其他使用者在修改資料庫中的資料。
可序列化隔離適合如下環境:
·大型資料庫中只更新少數幾行的短事務
·兩個併發事務將修改相同的行的可能性相對較低
·較長時間執行的事務主要為只讀事務
在可序列化隔離級別,在語句級別所獲得的讀取一致性通常延伸到整個事務 範圍。當重新讀取在同一事務中之前讀取的任何行時,保證結果相同。可以保證任何查詢在該事務的持續期間返回相同的結果,因此其他事務所做的更改是不可見的,無論該查詢已執行了多長時間。可序列化事務不會遇到髒讀、模糊讀取、或幻讀。
Oracle 資料庫允許可序列化事務修改行,只要當可序列化事務開始時,由其它事務對行所做更改已提交。當一個序列化事務試圖更新或刪除某資料,而該資料在序列化事務開始後被一個不同的事務更改並提交,則資料庫將生成一個錯誤:
Oracle 資料庫允許可序列化事務修改行,只要當可序列化事務開始時,由其它事務對行所做更改已提交。當一個序列化事務試圖更新或刪除某資料,而該資料在序列化事務開始後被一個不同的事務更改並提交,則資料庫將生成一個錯誤:
ORA-08177: Cannot serialize access for this transaction
當可序列化事務失敗,產生 ORA-08177 錯誤時,應用程式可以採取行動, 包括以下幾種:
·將所執行的工作提交到該點
·也許要先回滾到事務中之前建立的某儲存點,然後執行一些其他額外的( 不同)語句
·回滾整個事務
004 只讀隔離級別
只讀隔離級別類似於可序列化隔離級別,但只讀事務不允許資料在事務中被 修改,除非該使用者是 SYS。因此,只讀事務不會受到 ORA-08177 錯誤的影響。只讀事務可用於生成報表,其內容必須與事務開始時保持一致。
Oracle 資料庫透過按需從撤銷段重建資料,來實現讀取一致性。因為撤消段是以一個迴圈方式使用的,資料庫可以覆蓋撤銷資料。長時間執行的報表可能有一定的風險,讀取一致性所需要的撤銷資料,可能已被一個不同的事務重用,並丟擲快照太舊(snapshot too old)錯誤。設定一個撤消保留期,即在舊資料被覆蓋之前,資料庫嘗試保留撤消資料的最短時間,以期避免這一問題。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29067253/viewspace-1981468/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 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