最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

oracle 數(shù)據(jù)庫隔離級別學(xué)習(xí)

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

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

數(shù)據(jù)庫操作的隔離級別

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

新建一個(gè)測試表books:

name,code,price三個(gè)字段

添加兩條測試數(shù)據(jù)



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

復(fù)制代碼 代碼如下:

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

close();

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

復(fù)制代碼 代碼如下:

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

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

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

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

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

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

當(dāng)A事物執(zhí)行a,b的時(shí)候,若有B事物執(zhí)行更新操作,是有可能的
因?yàn)閍,b是不加鎖的

例子:

復(fù)制代碼 代碼如下:

//獲取連接和關(guān)閉連接代碼 省略 
//不自動(dòng)提交 
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(); 

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

/**
 * 如果這里再執(zhí)行a查詢的話,和第一次查詢結(jié)果就不一樣,因?yàn)橹虚g有B事務(wù)的提交更新
 * 修改,這也是不可重復(fù)讀
 */ 

//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 ,因?yàn)锽事務(wù)的干預(yù) 
    System.out.println("price:"+rs.getDouble(1)); 

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

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

以上通過實(shí)例介紹了oracle數(shù)據(jù)庫隔離級別的相關(guān)內(nèi)容,希望對大家有所幫助。

下面是一些補(bǔ)充:

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

1. READ UNCOMMITTED

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



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

2. READ COMMITTED

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

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

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

b. 丟失更新
在采用共享讀鎖的數(shù)據(jù)庫中,這種隔離級別可以防止丟失更新,比如事務(wù)1先讀取了第A行然后修改了這一行的C列(其他列也修改了只是值還和以前一樣,因?yàn)槌绦騿T都是整行的更新)。這個(gè)時(shí)候事務(wù)2想也想修改A行的時(shí)候會(huì)被阻塞,防止事務(wù)1的更新被覆蓋。

4. SEAIALIZABLE

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

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

相關(guān)文章

  • Oracle創(chuàng)建定時(shí)任務(wù)的方法步驟

    Oracle創(chuàng)建定時(shí)任務(wù)的方法步驟

    在日常的數(shù)據(jù)庫管理中,經(jīng)常會(huì)遇到需要定期執(zhí)行某個(gè)任務(wù)的需求,本文主要介紹了Oracle創(chuàng)建定時(shí)任務(wù)的方法步驟,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-02-02
  • Oracle 12CR2查詢轉(zhuǎn)換教程之cursor-duration臨時(shí)表詳解

    Oracle 12CR2查詢轉(zhuǎn)換教程之cursor-duration臨時(shí)表詳解

    這篇文章主要給大家介紹了關(guān)于Oracle 12CR2查詢轉(zhuǎn)換教程之cursor-duration臨時(shí)表的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-11-11
  • oracle數(shù)據(jù)匹配merge into的實(shí)例詳解

    oracle數(shù)據(jù)匹配merge into的實(shí)例詳解

    這篇文章主要介紹了oracle數(shù)據(jù)匹配merge into的實(shí)例詳解的相關(guān)資料,希望通過本文能幫助到大家,需要的朋友可以參考下
    2017-10-10
  • orcale中的to_number方法使用

    orcale中的to_number方法使用

    這篇文章主要介紹了orcale中的to_number方法使用,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • 淺析如何在tnsnames.ora中配置監(jiān)聽

    淺析如何在tnsnames.ora中配置監(jiān)聽

    以下是對如何在tnsnames.ora中配置監(jiān)聽進(jìn)行了詳細(xì)的分析介紹,需要的朋友可以過來參考下
    2013-08-08
  • Oracle創(chuàng)建只讀賬號的詳細(xì)步驟

    Oracle創(chuàng)建只讀賬號的詳細(xì)步驟

    本文介紹了Oracle創(chuàng)建只讀賬號的詳細(xì)步驟,有此需求的朋友可以參考下過程
    2021-06-06
  • oracle表的簡單操作步驟

    oracle表的簡單操作步驟

    這篇文章主要介紹了oracle表的簡單操作步驟,需要的朋友可以參考下
    2017-06-06
  • oracle數(shù)據(jù)庫排序后如何獲取第一條數(shù)據(jù)

    oracle數(shù)據(jù)庫排序后如何獲取第一條數(shù)據(jù)

    這篇文章主要介紹了oracle數(shù)據(jù)庫排序后如何獲取第一條數(shù)據(jù)問題,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • DBF 文件恢復(fù) ORACLE 數(shù)據(jù)庫的方法

    DBF 文件恢復(fù) ORACLE 數(shù)據(jù)庫的方法

    這篇文章主要介紹了DBF 文件 ORACLE 數(shù)據(jù)庫恢復(fù)的方法,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-01-01
  • 檢查Oracle數(shù)據(jù)庫版本的7種方法匯總

    檢查Oracle數(shù)據(jù)庫版本的7種方法匯總

    在Oracle數(shù)據(jù)庫的發(fā)展中,數(shù)據(jù)庫一直處于不斷升級狀態(tài),下面這篇文章主要給大家介紹了關(guān)于檢查Oracle數(shù)據(jù)庫版本的7種方法,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-10-10

最新評論

洪湖市| 高清| 资中县| 海兴县| 漳浦县| 南华县| 乐清市| 南华县| 辽中县| 开原市| 大名县| 舒城县| 禹州市| 中西区| 延安市| 格尔木市| 涞水县| 武乡县| 石林| 遂平县| 利川市| 黑水县| 石门县| 雷州市| 双柏县| 东山县| 屯留县| 龙陵县| 彝良县| 忻州市| 湘乡市| 罗源县| 兰坪| 浮梁县| 泉州市| 青浦区| 三门县| 木兰县| 革吉县| 彩票| 上高县|