亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

oracle 數據庫隔離級別學習

 更新時間:2014年05月01日 23:33:34   作者:  
這篇文章主要介紹了oracle數據庫的隔離級別相關的知識,數據庫操作的隔離級別,有需要的朋友可以參考下
oracle 事務隔離級別

事務不同引發(fā)的狀況:
臟讀(Dirty reads)
一個事務讀取另一個事務尚未提交的修改時,產生臟讀
很多數據庫允許臟讀以避免排它鎖的競爭。
不可重復讀(Nonrepeatable reads)
同一查詢在同一事務中多次進行,由于其他提交事務所做的修改或刪除,每次返回不同的結果集,此時發(fā)生非重復讀。
幻讀(Phantom reads)
同一查詢在同一事務中多次進行,由于其他提交事務所做的插入操作,每次返回不同的結果集,此時發(fā)生幻像讀。

數據庫操作的隔離級別

未提交讀(read uncommitted)
提交讀(read committed)
重復讀(repeatable read)
序列化(serializable)
oracle默認隔離級別read committed (statement level serialization)
每一個語句,在語句開始時,會獲取一個此刻的數據快照。
一個事務有多條語句,如果語句之間存在其它完成的事務,這可能引起不可持續(xù)讀和幻讀。

新建一個測試表books:

name,code,price三個字段

添加兩條測試數據



使用pl/sql和java程序模擬并發(fā)
不允許臟讀測試:
程序段首先查詢code是qqq的書的價格

復制代碼 代碼如下:

//獲取連接 省略 
pstat = conn.prepareStatement("select price from books where code='qqq'"); 
rs = pstat.executeQuery(); 
while(rs.next()){ 
  System.out.println("price:"+rs.getDouble(1)); 

close();

輸出結果:price:15.0
然后pl/sql執(zhí)行更新

復制代碼 代碼如下:

update books set price=18 where code='qqq';

!pl/sql設置成手動更新,不自動更新
在執(zhí)行上面java查詢代碼
輸出仍是price:15.0,說明讀不到pl/sql中未提交的執(zhí)行結果,即不允許臟讀
pl/sql 執(zhí)行
commit;

在執(zhí)行java查詢:
輸出結果:price:18.0

會有不可重復讀何幻讀的現(xiàn)象發(fā)生就不用測試了吧,
這兩種現(xiàn)象都是針對提交后事物的讀引起的,read commited隔離級別是允許對提交后
的事物進行讀的。

隔離級別:重復讀(repeatable read)
這個不允許臟讀,不可重復讀,但是會有幻讀現(xiàn)象。
這個oracle不支持,不好測試。
理解的話就是如果一條查詢語句查詢的內容有其它事物正在更新的時候,這
查詢處于等待狀態(tài),直到先前事物提交更新后,才會執(zhí)行本條查詢。也就是
查詢的時候也會有鎖,需要等待并發(fā)的事物釋放鎖。然后自己獲取到鎖,執(zhí)行
自己事物。這樣查詢也加鎖,并發(fā)性更低
select ... for update 就是這樣可以避免不可重復讀的發(fā)生

隔離級別:serializable
這個就更嚴格了,事物執(zhí)行是一個一個的。一個事務中的語句共享同一個數據快照(在事務開始時存在的數據)。
是事物級別的,臟讀,不可重復讀,幻讀根本就沒有機會發(fā)生。
前面像read committed都是語句級別的,以語句為單元。
比如
read committed一個事物A有a(select),b(select),c(update)三條語句

當A事物執(zhí)行a,b的時候,若有B事物執(zhí)行更新操作,是有可能的
因為a,b是不加鎖的

例子:

復制代碼 代碼如下:

//獲取連接和關閉連接代碼 省略 
//不自動提交 
conn.setAutoCommit(false); 
/**
 * a 查詢
 */ 
pstat = conn.prepareStatement("select price from books where code='qqq'"); 
rs = pstat.executeQuery(); 
while(rs.next()){ 
    //輸出 price:25.0 
    System.out.println("price:"+rs.getDouble(1)); 

close(); 

/**
 * 暫停一會,用pl/sql執(zhí)行B事務
 * update books set price=15 where code='qqq';
 * commit;
 */ 
Thread.sleep(10000); 

/**
 * 如果這里再執(zhí)行a查詢的話,和第一次查詢結果就不一樣,因為中間有B事務的提交更新
 * 修改,這也是不可重復讀
 */ 

//b 更新 
pstat = conn.prepareStatement("update books set price=price+10 where code='qqq'"); 
pstat.executeUpdate(); 
close(); 
//c 查詢 
pstat = conn.prepareStatement("select price from books where code='qqq'"); 
rs = pstat.executeQuery(); 
while(rs.next()){ 
    //輸出 還是price:25.0 ,因為B事務的干預 
    System.out.println("price:"+rs.getDouble(1)); 

close(); 
//提交事務 
conn.commit(); 
if(conn != null){ 
    conn.close(); 
}

上面執(zhí)行的順序,事務B是在A的執(zhí)行過程中執(zhí)行的。

以上通過實例介紹了oracle數據庫隔離級別的相關內容,希望對大家有所幫助。

下面是一些補充:

數據庫中的事務基本作用是將數據庫從一致狀態(tài)轉換到另一種一致狀態(tài),那么事務隔離級別就是定義了一個事務對于另外一個事務做出的修改有多“敏感”。也就是不同的隔離級別定義了事務相互影響的程度,下面分別介紹一下幾種不同的隔離級別。

1. READ UNCOMMITTED

其實,oracle不支持這種隔離級別。這種隔離級別允許臟讀(也就是可以讀取到用戶未提交的數據),支持這種隔離級別的數據庫主要是為了支持非阻塞讀,但是oracle默認支持非阻塞讀,所以oracle里面不支持這種隔離級別。下面舉一個例子:



如上圖所示,假設某一家銀行要統(tǒng)計所有賬號總共有多少金額。事務A負責統(tǒng)計,事務A從第一行開始讀取。假設讀取到100行的時候,事務B從賬號123轉了400元到賬戶987(事務B還未提交),支持臟讀的數據庫當事務A讀取到342023行的時候,就會得到500元,從而多加了400元。

2. READ COMMITTED

這種隔離級別指的是,事務只能讀取已經提交的數據,(但是支持可重復讀與幻想讀)是oracle數據庫默認的隔離模式。其實這種隔離級別在別的數據庫里面可能還是會“退化”得像臟讀一樣。就看前面那個例子,假設在事務A讀取到342023行前,事務B提前鎖定了這一行,并將金額由100改成了500。那么事務A讀取到這一行的時候,發(fā)現(xiàn)已經被其他事務鎖定了,于是進行等待,直到事務B提交。但是當事務B提交之后,事務A還是讀取到了500這一個錯誤信息,這樣就和臟讀一樣的了,而且還讓用戶等待這個錯誤的答案。

3. REPEATABLE READ
這種隔離級別不支持臟讀,不支持可重復讀,支持幻想讀。主要是為了得到一致性的答案與防止丟失更新。  

a. 得到一致性答案
在oracle里面這個通過多版本機制得到了實現(xiàn),但是在其他的數據庫需要通過加鎖機制進行控制,就以上一個例子為例,怎樣才能統(tǒng)計出正確的總金額呢,事務A在讀取每一行的時候,給每一行加上共享讀鎖,這樣當事務B執(zhí)行從賬號123轉400元到賬戶987的時候。先是操作第一行將賬戶123的金額由500修改成100,但是第一行已經被事務A鎖定,于是等待,這樣事務A能夠讀取到正確的數據。但是如果事務B執(zhí)行的操作是從賬戶987轉50元到賬戶123的時候,事務B先操作第342023行,發(fā)現(xiàn)沒有被鎖定,于是鎖定將金額由100修改成50,然后操作第一行,發(fā)現(xiàn)鎖定了于是等待。而事務A讀取到342023行的時候,發(fā)現(xiàn)這一行已經被事務B鎖定于是等待,這樣就陷入了死鎖。

b. 丟失更新
在采用共享讀鎖的數據庫中,這種隔離級別可以防止丟失更新,比如事務1先讀取了第A行然后修改了這一行的C列(其他列也修改了只是值還和以前一樣,因為程序員都是整行的更新)。這個時候事務2想也想修改A行的時候會被阻塞,防止事務1的更新被覆蓋。

4. SEAIALIZABLE

不允許臟讀,重復讀與幻想讀,最高的隔離級別。這種隔離級別標明事務A在操作數據庫的時候好像就只有事務A在操作,沒有其他事務在操作數據庫一樣。
Oracle 中是這樣實現(xiàn) SERIALIZABLE 事務的:原本通常在語句級得到的讀一致性現(xiàn)在可以擴展到事務級。也就是在事務執(zhí)行的那一刻,將這個事務將要操作的數據拍了一張照片。

從上面的例子我們可以看出,其他數據庫采用共享讀鎖來解決統(tǒng)計總金額問題是沒有oracle多版本機制靈活的,其一嚴重影響了程序的并發(fā)性,讀阻塞了寫。其二可能引起死鎖。

相關文章

  • oracle常用sql查詢語句部分集合(圖文)

    oracle常用sql查詢語句部分集合(圖文)

    這篇文章主要介紹了oracle常用sql查詢語句部分,并用圖文并茂的方式為大家進程實例說明,需要的朋友可以參考下
    2013-08-08
  • Oracle查詢表占用空間大小方式

    Oracle查詢表占用空間大小方式

    這篇文章主要介紹了Oracle查詢表占用空間大小方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • ORACLE中的的HINT詳解

    ORACLE中的的HINT詳解

    本篇文章主要介紹了ORACLE中的的HINT詳解,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-12-12
  • oracle drop table(表)數據恢復方法

    oracle drop table(表)數據恢復方法

    drop table刪除表以后怎樣可以恢復,本文整理了一些操作語句,感興趣的朋友可以研究下,或許可以幫助到你
    2013-04-04
  • 一文解決ORA-01034:?ORACLE?not?available報錯

    一文解決ORA-01034:?ORACLE?not?available報錯

    這篇文章主要給大家介紹了關于ORA-01034:?ORACLE?not?available報錯解決的相關資料,這是oracle數據庫啟動經常會遇到的問題,文中通過圖文介紹的非常詳細,需要的朋友可以參考下
    2024-03-03
  • oracle 觸發(fā)器 學習筆記

    oracle 觸發(fā)器 學習筆記

    觸發(fā)器 是特定事件出現(xiàn)的時候,自動執(zhí)行的代碼塊。類似于存儲過程,但是用戶不能直接調用他們。
    2009-05-05
  • Oracle生成隨機數字、字符串、日期、驗證碼及 UUID的方法

    Oracle生成隨機數字、字符串、日期、驗證碼及 UUID的方法

    這篇文章主要介紹了Oracle生成隨機數字、字符串、日期、驗證碼及 UUID的方法,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-02-02
  • Oracle中scott表結構與簡單查詢實例分析

    Oracle中scott表結構與簡單查詢實例分析

    這篇文章主要介紹了Oracle中scott表結構與簡單查詢,實例分析Oracle查詢的相關技巧,需要的朋友可以參考下
    2015-04-04
  • 詳細整理Oracle中常用函數

    詳細整理Oracle中常用函數

    本文詳細講解了Oracle中常用函數,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-12-12
  • oracle數據庫中如何處理clob字段方法介紹

    oracle數據庫中如何處理clob字段方法介紹

    在知識庫的建立的時候,用普通VARCHAR2存放文章是顯然不夠的,本文將詳細將介紹oracle數據庫中如何處理clob字段方法,需要的朋友可以參考下
    2012-11-11

最新評論