Oracle 資料庫事務隔離級別

2021-07-02 05:15:12 字數 1507 閱讀 1718

事務隔離級別:乙個事務對資料庫的修改與並行的另乙個事務的隔離程度。

兩個併發事務同時訪問資料庫表相同的行時,可能存在以下三個問題:

幻想讀:事務t1讀取一條指定where條件的語句,返回結果集。此時事務t2插入一行新記錄,恰好滿足t1的where條件。然後t1使用相同的條件再次查詢,結果集中可以看到t2插入的記錄,這條新紀錄就是幻想。

不可重複讀取:事務t1讀取一行記錄,緊接著事務t2修改了t1剛剛讀取的記錄,然後t1再次查詢,發現與第一次讀取的記錄不同,這稱為不可重複讀。

髒讀:事務t1更新了一行記錄,還未提交所做的修改,這個t2讀取了更新後的資料,然後t1執行回滾操作,取消剛才的修改,所以t2所讀取的行就無效,也就是髒資料。

資料庫事務的隔離級別有4個,由低到高依次為read uncommitted、read committed、repeatable read、serializable,這四個級別可以逐個解決髒讀、不可重複讀、幻讀這幾類問題

√: 可能出現    ×: 不會出現 髒讀

不可重複讀

幻讀read uncommitted√√

√read committed×√

√repeatable read××

√serializable××

×oracle資料庫支援read committed 和 serializable這兩種事務隔離級別。所以oracle不支援髒讀

sql標準所定義的預設事務隔離級別是

serializable,但是oracle 預設使用的是

read committed

設定隔離級別使用

set transaction isolation level [

read uncommitted |

read committed |

repeatable read |

serializable]

下面是oracle 設定serializable隔離級別乙個示例:

-- 設定oracle事務的隔離級別(預設為read committed)

左面是事務t1,右面是事務t2,因為t2級別為serializable,所以即使事務t1在提交了資料之後,事務t2還是看不到t1提交的資料,幻想讀和不可重複讀都不允許了。

那如何能檢視到t1新增的記錄呢? 上面t1和t2是併發執行,在t1執行insert的時候事務t2已經開始了,因為t2級別是serializable,所以t2所查詢的資料集是t2事務開始前資料庫的資料。即事務t1在事務t2開始之後的insert和update操作的影響都不會影響事務t2。現在重新開啟乙個事務t3 就可以看到t1新增的記錄了。

當下列事件發生時,事務就開始了:

1、連線到資料庫,並執行第一條dml語句

2、前乙個事務結束後,又輸入了另一條dml語句

ORACLE資料庫事務隔離級別

事務隔離級別 乙個事務對資料庫的修改與並行的另乙個事務的隔離程度。兩個併發事務同時訪問資料庫表相同的行時,可能存在以下三個問題 1 幻想讀 事務t1讀取一條指定where條件的語句,返回結果集。此時事務t2插入一行新記錄,恰好滿足t1的where條件。然後t1使用相同的條件再次查詢,結果集中可以看到...

ORACLE資料庫事務隔離級別

oracle資料庫事務隔離級別 事務隔離級別 乙個事務對資料庫的修改與並行的另乙個事務的隔離程度。兩個併發事務同時訪問資料庫表相同的行時,可能存在以下三個問題 1 幻想讀 事務t1讀取一條指定where條件的語句,返回結果集。此時事務t2插入一行新記錄,恰好滿足t1的where條件。然後t1使用相同...

ORACLE資料庫事務隔離級別

事務隔離級別 乙個事務對資料庫的修改與並行的另乙個事務的隔離程度。兩個併發事務同時訪問資料庫表相同的行時,可能存在以下三個問題 1 幻想讀 事務t1讀取一條指定where條件的語句,返回結果集。此時事務t2插入一行新記錄,恰好滿足t1的where條件。然後t1使用相同的條件再次查詢,結果集中可以看到...