欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Oracle事務(wù)(transaction)詳解

 更新時(shí)間:2022年05月26日 15:33:49   作者:springsnow  
本文詳細(xì)講解了Oracle中的事務(wù)(transaction),文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

一、數(shù)據(jù)異常

因?yàn)镺racle中支持多個(gè)事務(wù)并發(fā)執(zhí)行,所以會(huì)出現(xiàn)下面的數(shù)據(jù)異常。

  • 臟讀(Dirty Read):事務(wù)T1更新了一行數(shù)據(jù),還沒(méi)有提交所做的修改,T2讀取更新后的數(shù)據(jù),T1回滾,T2讀取的數(shù)據(jù)無(wú)效,這種數(shù)據(jù)稱(chēng)為臟讀數(shù)據(jù)。
  • 不可重復(fù)讀(UNrepeatable Read):事務(wù)T1讀取一行數(shù)據(jù),T2修改了T1剛剛讀取的記錄,T1再次查詢(xún),發(fā)現(xiàn)與第一次讀取的記錄不相同,稱(chēng)為不可重復(fù)讀。
  • 幻讀(Phantom Read):事務(wù)T1讀取一條帶WHERE條件的語(yǔ)句,返回結(jié)果集,T2插入一條新紀(jì)錄,恰好也是T1的WHERE條件,T1再次查詢(xún),結(jié)果集中又看到T2的記錄,新紀(jì)錄就叫做幻讀。

事務(wù)中遇到的這些異常與事務(wù)的隔離性設(shè)置有關(guān),事務(wù)的隔離性設(shè)置越多,異常就出現(xiàn)的越少,但并發(fā)效果就越低,事務(wù)的隔離性設(shè)置越少,異常出現(xiàn)的越多,并發(fā)效果越高。

二、隔離級(jí)別:

針對(duì)讀取數(shù)據(jù)時(shí)可能產(chǎn)生的不一致現(xiàn)象,在SQL92標(biāo)準(zhǔn)中定義了4個(gè)事務(wù)的隔離級(jí)別:

  • NO_TRANSACTION 不支持事務(wù)
  • READ_UNCOMMITED 允許臟讀、不可重復(fù)讀、幻讀
  • READ_COMMITED 允許不可重復(fù)讀、幻讀,不允許臟讀
  • REPEATABLE 允許幻讀,不允許臟讀、不可重復(fù)讀
  • SERIALIZABLE 臟讀、不可重復(fù)讀、幻讀都不允許

Oracle默認(rèn)的隔離級(jí)別是read committed。

Oracle支持SQL92標(biāo)準(zhǔn)的READ_COMMITED、SERIALIZABLE,自身特有的Read only和Read write隔離級(jí)別。

  • Read only:事務(wù)中不能有任何修改數(shù)據(jù)庫(kù)中數(shù)據(jù)的操作語(yǔ)句,是Serializable的一個(gè)子集。
  • Read write:它是默認(rèn)設(shè)置,該選項(xiàng)表示在事務(wù)中可以有訪問(wèn)語(yǔ)句、修改語(yǔ)句,但不經(jīng)常使用。

1、設(shè)置隔離級(jí)別

設(shè)置一個(gè)事務(wù)的隔離級(jí)別:

SET TRANSACTION ISOLATION LEVEL READ COMMITTED; 
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE; 
SET TRANSACTION READ ONLY; 
SET TRANSACTION READ WRITE;

注意:這些語(yǔ)句是互斥的,不能同時(shí)設(shè)置兩個(gè)或兩個(gè)以上的選項(xiàng)。

設(shè)置單個(gè)會(huì)話(huà)的隔離級(jí)別:

ALTER SESSION SET TRANSACTION ISOLATION LEVEL READ COMMITTED; 
ALTER SESSION SET TRANSACTION ISOLATION SERIALIZABLE;

三、數(shù)據(jù)庫(kù)鎖:

在數(shù)據(jù)庫(kù)中有兩種基本的鎖類(lèi)型:排它鎖(Exclusive Locks,即X鎖)和共享鎖(Share Locks,即S鎖)。

  • 排它鎖:(X鎖,eXclusive Locks) 
    當(dāng)有DML語(yǔ)句執(zhí)行的時(shí)候,設(shè)計(jì)的行都會(huì)加上排它鎖,其他事物不能進(jìn)行讀取修改。
  • 共享鎖:(S鎖,Shared Locks) 
    加了共享鎖的數(shù)據(jù),可以被其他事物讀取,但不能修改。如select語(yǔ)句。

為了保證性能:樂(lè)觀鎖,悲觀鎖

  • 悲觀鎖:每次都是假設(shè)數(shù)據(jù)肯定會(huì)沖突,數(shù)據(jù)開(kāi)始讀取時(shí)就把數(shù)據(jù)給鎖住。
  • 樂(lè)觀鎖:每次都是假設(shè)一般情況下不會(huì)發(fā)生數(shù)據(jù)沖突,只有數(shù)據(jù)更新提交的時(shí)候,才會(huì)對(duì)數(shù)據(jù)的沖突與否進(jìn)行檢測(cè),如果發(fā)生沖突,返回錯(cuò)誤信息讓用戶(hù)處理。

在Oracle中最主要的鎖是DML鎖(data locks,數(shù)據(jù)鎖),DML鎖的目的在于保證并發(fā)情況下的數(shù)據(jù)完整性。在Oracle數(shù)據(jù)庫(kù)中,DML鎖主要包括TM鎖和TX鎖,其中TM鎖稱(chēng)為表級(jí)鎖,TX鎖稱(chēng)為事務(wù)鎖或行級(jí)鎖。

1、Oracle中的鎖

鎖有“共享鎖”、“排它鎖”,“共享排它鎖”等多種類(lèi)型,而且每種類(lèi)型又有“行級(jí)鎖” (一次鎖住一條記錄),“頁(yè)級(jí)鎖” (一次鎖住一頁(yè),即數(shù)據(jù)庫(kù)中存儲(chǔ)記錄的最小可分配單元),“表級(jí)鎖” (鎖住整個(gè)表)。

(1)共享鎖(S鎖) 
添加該S鎖。在該鎖定模式下,不允許任何用戶(hù)更新表。但是允許其他用戶(hù)發(fā)出select …from for update命令對(duì)表添加RS鎖。

lock table in share mode

(2)排他鎖(X鎖) 
添加X(jué)鎖。在該鎖定模式下,其他用戶(hù)不能對(duì)表進(jìn)行任何的DML和DDL操作,該表上只能進(jìn)行查詢(xún)。

lock table in exclusive mode

(3)行級(jí)共享鎖(RS鎖) 
通常是通過(guò)語(yǔ)句添加的,同時(shí)該方法也是我們用來(lái)手工鎖定某些記錄的主要方法。比如,當(dāng)我們?cè)诓樵?xún)某些記錄的過(guò)程中,不希望其他用戶(hù)對(duì)查詢(xún)的記錄進(jìn)行更新操作,則可以發(fā)出這樣的語(yǔ)句。當(dāng)數(shù)據(jù)使用完畢以后,直接發(fā)出rollback命令將鎖定解除。當(dāng)表上添加了RS鎖定以后,不允許其他事務(wù)對(duì)相同的表添加排他鎖,但是允許其他的事務(wù)通過(guò)DML語(yǔ)句或lock命令鎖定相同表里的其他數(shù)據(jù)行。

select … from for update

(4)行級(jí)排他鎖(RX鎖) 
當(dāng)進(jìn)行DML操作時(shí)會(huì)自動(dòng)在被更新的表上添加RX鎖,或者也可以通過(guò)執(zhí)行l(wèi)ock命令顯式的在表上添加RX鎖。在該鎖定模式下,允許其他的事務(wù)通過(guò)DML語(yǔ)句修改相同表里的其他數(shù)據(jù)行,或通過(guò)lock命令對(duì)相同表添加RX鎖定,但是不允許其他事務(wù)對(duì)相同的表添加排他鎖(X鎖)。

(5)共享行級(jí)排他鎖(SRX鎖) 
添加SRX鎖。該鎖定模式比行級(jí)排他鎖和共享鎖的級(jí)別都要高,這時(shí)不能對(duì)相同的表進(jìn)行DML操作,也不能添加共享鎖。

lock table in share row exclusive mode

上述幾種鎖模式中,RS鎖是限制最少的鎖,X鎖是限制最多的鎖。當(dāng)程序?qū)λ龅男薷倪M(jìn)行提交(Commit)或回滾(Rollback)后,鎖住的資源便會(huì)得到釋放,從而允許其他用戶(hù)進(jìn)行操作。如果兩個(gè)事務(wù),分別鎖定一部分?jǐn)?shù)據(jù),而都在等待對(duì)方釋放鎖才能完成事務(wù)操作,這種情況下就會(huì)發(fā)生死鎖。

下圖列出產(chǎn)生鎖定模式的SQL語(yǔ)句:

四、事務(wù)組成:

一條或者多條DML,[一條DDL]和一條DCL。

五、事務(wù)的分類(lèi):

1、顯式事務(wù):

  • 顯式的調(diào)用DCL。
  • 只有用到COMMIT以后才會(huì)真正寫(xiě)入數(shù)據(jù)庫(kù),也持久化了。

2、隱式事務(wù):

  • 如果人工要使用隱式事務(wù),SET AUTOCOMMIT ON (只針對(duì)一個(gè)連接)
  • 以下情況為自動(dòng)提交: 
    1)正常執(zhí)行完成的DDL語(yǔ)句:create、alter、drop 
    2)正常執(zhí)行完場(chǎng)的DCL語(yǔ)句GRANT、REVOKE 
    3)正常退出的SQLPlus或者SQL Developer等客戶(hù)端

六、事務(wù)控制命令

1、提交事務(wù)

在執(zhí)行使用COMMIT語(yǔ)句可以提交事務(wù),當(dāng)執(zhí)行了COMMIT語(yǔ)句后,會(huì)確認(rèn)事務(wù)的變化,結(jié)束事務(wù),刪除保存點(diǎn),釋放鎖。當(dāng)使用COMMIT語(yǔ)句結(jié)束事務(wù)之后,其他會(huì)話(huà)將可以查看到事務(wù)變化后的新數(shù)據(jù)。

2、回滾事務(wù)

保存點(diǎn)(savepoint):是事務(wù)中的一點(diǎn),用于取消部分事務(wù),當(dāng)結(jié)束事務(wù)時(shí),會(huì)自動(dòng)的刪除該事務(wù)所定義的所有保存點(diǎn)。當(dāng)執(zhí)行ROLLBACK時(shí),通過(guò)指定保存點(diǎn)可以回退到指定的點(diǎn)。

設(shè)置保存點(diǎn):

Savepoint a;

刪除保存點(diǎn):

Release Savepoint a;

回滾部分事務(wù):

Rollback To a;

回滾全部事務(wù):

Rollback;

七、示例

銀行轉(zhuǎn)帳的例子是最經(jīng)典的事務(wù)示例:

-- 從賬戶(hù)一向賬戶(hù)二轉(zhuǎn)賬
DECLARE
    v_money     NUMBER(8, 2); -- 轉(zhuǎn)賬金額
    v_balance   account.balance%TYPE; -- 賬戶(hù)余額
BEGIN
    v_money := &轉(zhuǎn)賬金額; -- 輸入轉(zhuǎn)賬金額
  -- 從賬戶(hù)一減錢(qián)  
    UPDATE account
    SET
        balance = balance - v_money WHERE     id = &轉(zhuǎn)出賬戶(hù)  
        RETURNING balance INTO v_balance;

    IF SQL%notfound THEN
        raise_application_error(-20001, '沒(méi)有該賬戶(hù):' || &轉(zhuǎn)出賬戶(hù));
    END IF;

    IF v_balance < 0 THEN
        raise_application_error(-20002, '賬戶(hù)余額不足');
    END IF;

  -- 向賬戶(hù)二加錢(qián)
    UPDATE account
    SET        balance = balance + v_money    WHERE        id = &轉(zhuǎn)入賬戶(hù);

    IF SQL%notfound THEN
        raise_application_error(-20001, '沒(méi)有該賬戶(hù):' || &轉(zhuǎn)入賬戶(hù));
    END IF;

  -- 如果沒(méi)有異常,則提交事務(wù)

    COMMIT;
    dbms_output.put_line('轉(zhuǎn)賬成功');
EXCEPTION
    WHEN OTHERS THEN
        ROLLBACK; -- 出現(xiàn)異常則回滾事務(wù)
        dbms_output.put_line('轉(zhuǎn)賬失敗:');
        dbms_output.put_line(sqlerrm);
END;

到此這篇關(guān)于Oracle事務(wù)(transaction)的文章就介紹到這了。希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Oracle數(shù)據(jù)回退的實(shí)現(xiàn)

    Oracle數(shù)據(jù)回退的實(shí)現(xiàn)

    在使用plsql工具,對(duì)表數(shù)據(jù)進(jìn)行操作后,提交了事務(wù),發(fā)現(xiàn)數(shù)據(jù)更新或者刪除錯(cuò)了,這時(shí)候還是有方法可以把數(shù)據(jù)回退的,本文就詳細(xì)的介紹此方法,感興趣的可以了解一下
    2023-08-08
  • Oracle數(shù)據(jù)庫(kù)的啟動(dòng)和關(guān)閉順序?qū)嵗v解

    Oracle數(shù)據(jù)庫(kù)的啟動(dòng)和關(guān)閉順序?qū)嵗v解

    這篇文章主要介紹了Oracle數(shù)據(jù)庫(kù)的啟動(dòng)和關(guān)閉順序?qū)嵗v解的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2016-07-07
  • windows本地安裝配置oracle客戶(hù)端完整流程(圖文版)

    windows本地安裝配置oracle客戶(hù)端完整流程(圖文版)

    這篇文章主要介紹了windows本地安裝配置oracle客戶(hù)端完整流程,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2019-09-09
  • Oracle 11g安裝錯(cuò)誤提示未找到wfmlrsvcapp.ear的解決方法

    Oracle 11g安裝錯(cuò)誤提示未找到wfmlrsvcapp.ear的解決方法

    這篇文章主要為大家詳細(xì)介紹了Oracle 11g安裝錯(cuò)誤提示未找到wfmlrsvcapp.ear的解決方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-04-04
  • Oracle的控制文件管理

    Oracle的控制文件管理

    Oracle 的控制文件記錄了當(dāng)前數(shù)據(jù)庫(kù)的結(jié)構(gòu)信息,包含數(shù)據(jù)文件及日志文件的信息以及相關(guān)的狀態(tài)、歸檔信息等,本文主要介紹了Oracle的控制文件管理,感興趣的可以了解一下
    2023-12-12
  • Oracle查詢(xún)表占用的空間(表大小)的3種方法

    Oracle查詢(xún)表占用的空間(表大小)的3種方法

    這篇文章主要給大家介紹了關(guān)于Oracle查詢(xún)表占用的空間(表大小)的3種方法,表空間是oracle數(shù)據(jù)庫(kù)中最大的邏輯單位與存儲(chǔ)空間單位,數(shù)據(jù)庫(kù)系統(tǒng)通過(guò)表空間為數(shù)據(jù)庫(kù)對(duì)象分配空間,需要的朋友可以參考下
    2023-10-10
  • oracle 徹底刪除方法

    oracle 徹底刪除方法

    如果有個(gè)別DLL文件無(wú)法刪除的情況,則不用理會(huì),重新啟動(dòng),開(kāi)始新的安裝,安裝時(shí),選擇一個(gè)新的目錄,則,安裝完畢并重新啟動(dòng)后,老的目錄及文件就可以刪除掉了。
    2009-06-06
  • Oracle約束管理腳本

    Oracle約束管理腳本

    Oracle約束管理腳本...
    2007-03-03
  • oracle與gbase8s遷移數(shù)據(jù)類(lèi)型對(duì)照以及舉例說(shuō)明

    oracle與gbase8s遷移數(shù)據(jù)類(lèi)型對(duì)照以及舉例說(shuō)明

    gbase8s是一個(gè)高性能的分布式關(guān)系型數(shù)據(jù)庫(kù),下面這篇文章主要給大家介紹了關(guān)于oracle與gbase8s遷移數(shù)據(jù)類(lèi)型對(duì)照以及舉例說(shuō)明的相關(guān)資料,文中通過(guò)圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2023-12-12
  • Oracle賬戶(hù)被鎖錯(cuò)誤:the?account?is?locked解決方法

    Oracle賬戶(hù)被鎖錯(cuò)誤:the?account?is?locked解決方法

    the?account?is?locked意思是賬戶(hù)被鎖定了,這種情況需要大家去解鎖,這篇文章主要給大家介紹了關(guān)于Oracle賬戶(hù)被鎖錯(cuò)誤:the?account?is?locked的解決方法,需要的朋友可以參考下
    2023-12-12

最新評(píng)論