婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > ORACLE數據庫事務隔離級別介紹

ORACLE數據庫事務隔離級別介紹

熱門標簽:溫州人工外呼系統 北京外呼系統公司排名 地圖標注付款了怎么找不到了 貴陽智能電銷機器人官網 北京營銷外呼系統廠家 百度地圖標注員是干什么 沈陽400電話是如何辦理 外呼系統口號 外呼系統鄭州

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

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 允許幻想讀,不允許不可重復讀和臟讀。在一個事務中,如果在兩次相同條件的讀取操作之間沒有添加記錄的操作,也沒有其他更新操作導致在這個查詢條件下記錄數增多,則兩次讀取結果相同。換句話說,就是在一個事務中第一次讀取的記錄保證不會在這個事務期間發生改動。SQL Server是通過在整個事務期間給讀取的記錄加鎖實現這種隔離級別的,這樣,在這個事務結束前,其他會話不能修改事務中讀取的記錄,而只能等待事務結束,但是SQL Server不會阻礙其他會話向表中添加記錄,也不阻礙其他會話修改其他記錄。

SERIALIZABLE 幻想讀、不可重復讀和臟讀都不允許。在一個事務中,讀取操作的結果是在這個事務開始之前其他事務就已經提交的記錄,SQL Server通過在整個事務期間給表加鎖實現這種隔離級別。在這種隔離級別下,對這個表的所有DML操作都是不允許的,即要等待事務結束,這樣就保證了在一個事務中的兩次讀取操作的結果肯定是相同的。SQL標準所定義的默認事務隔離級別是SERIALIZABLE。

二、Oracle中的隔離級別及實現機制:

Oracle數據庫支持READ COMMITTED 和 SERIALIZABLE這兩種事務隔離級別。所以Oracle不支持臟讀,即Oracle中不允許一個會話讀取其他事務未提交的數據修改結果,從而防止了由于事務回滾發生的讀取不正確

Oracle回滾段,在修改數據記錄時,會把這些記錄被修改之前的結果存入回滾段或撤銷段中。Oracle讀取操作不會阻礙更新操作,更新操作也不會阻礙讀取操作,這樣在Oracle中的各種隔離級別下,讀取操作都不會等待更新事務結束,更新操作也不會因為另一個事務中的讀取操作而發生等待,這也是Oracle事務處理的一個優勢所在。

Oracle缺省的配置是Read Committed隔離級別(也稱為語句級別的隔離),在這種隔離級別下,如果一個事務正在對某個表執行 DML操作,而這時另外一個會話對這個表的記錄執行讀取操作,則Oracle會去讀取回滾段或撤銷段中存放的更新之前的記錄,而不會象SQL Server一樣等待更新事務的結束。

Oracle的Serializable隔離級別(也稱為事務級別的隔離),事務中的讀取操作只能讀取這個事務開始之前已經提交的數據結果。如果在讀取時,其他事務正在對記錄執行修改,則Oracle就會在回滾段或撤銷段中去尋找對應的原來未經修改的記錄(而且是在讀取操作所在的事務開始之前存放于回滾段或撤銷段的記錄),這時讀取操作也不會因為相應記錄被更新而等待。

設置隔離級別使用 SET TRANSACTION ISOLATION LEVEL [READ UNCOMMITTED|READ COMMITTED|REPEATABLE READ|SERIALIZABLE]

下面是oracle 設置SERIALIZABLE隔離級別一個示例:

左面是事務T1,右面是事務T2,因為T2級別為SERIALIZABLE,所以即使事務T1在提交了數據之后,事務T2還是看不到T1提交的數據,幻想讀和不可重復讀都不允許了。

那如何能查看到T1新增的記錄呢? 上面T1和T2是并發執行,在T1執行insert的時候事務T2已經開始了,因為T2級別是SERIALIZABLE,所以T2所查詢的數據集是T2事務開始前數據庫的數據。即事務T1在事務T2開始之后的insert和update操作的影響都不會影響事務T2?,F在重新開啟一個事務T3 就可以看到T1新增的記錄了。

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

1、連接到數據庫,并執行第一條DML語句
2、前一個事務結束后,又輸入了另一條DML語句

您可能感興趣的文章:
  • oracle 合并查詢 事務 sql函數小知識學習
  • Oracle中死事務的檢查語句
  • MSSQL與Oracle數據庫事務隔離級別與鎖機制對比
  • Java與Oracle實現事務(JDBC事務)實例詳解
  • ORACLE中如何找到未提交事務的SQL語句詳解

標簽:通遼 溫州 包頭 衡水 衢州 潮州 淮北 定西

巨人網絡通訊聲明:本文標題《ORACLE數據庫事務隔離級別介紹》,本文關鍵詞  ORACLE,數據庫,事務,隔離,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《ORACLE數據庫事務隔離級別介紹》相關的同類信息!
  • 本頁收集關于ORACLE數據庫事務隔離級別介紹的相關信息資訊供網民參考!
  • 推薦文章
    主站蜘蛛池模板: 克山县| 伊吾县| 额尔古纳市| 巨野县| 乌恰县| 山阳县| 浮梁县| 缙云县| 论坛| 资兴市| 娱乐| 扎鲁特旗| 象山县| 沈阳市| 大名县| 民权县| 磐石市| 佛教| 吴江市| 澄城县| 毕节市| 大港区| 彝良县| 福清市| 德惠市| 轮台县| 汝南县| 资溪县| 开封县| 龙泉市| 观塘区| 拉萨市| 无棣县| 新龙县| 清镇市| 吴川市| 宁强县| 集贤县| 黎城县| 璧山县| 兴国县|