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

Oracle事務(transaction)詳解

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

一、數據異常

因為Oracle中支持多個事務并發(fā)執(zhí)行,所以會出現下面的數據異常。

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

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

二、隔離級別:

針對讀取數據時可能產生的不一致現象,在SQL92標準中定義了4個事務的隔離級別:

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

Oracle默認的隔離級別是read committed。

Oracle支持SQL92標準的READ_COMMITED、SERIALIZABLE,自身特有的Read only和Read write隔離級別。

  • Read only:事務中不能有任何修改數據庫中數據的操作語句,是Serializable的一個子集。
  • Read write:它是默認設置,該選項表示在事務中可以有訪問語句、修改語句,但不經常使用。

1、設置隔離級別

設置一個事務的隔離級別:

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

注意:這些語句是互斥的,不能同時設置兩個或兩個以上的選項。

設置單個會話的隔離級別:

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

三、數據庫鎖:

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

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

為了保證性能:樂觀鎖,悲觀鎖

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

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

1、Oracle中的鎖

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

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

lock table in share mode

(2)排他鎖(X鎖) 
添加X鎖。在該鎖定模式下,其他用戶不能對表進行任何的DML和DDL操作,該表上只能進行查詢。

lock table in exclusive mode

(3)行級共享鎖(RS鎖) 
通常是通過語句添加的,同時該方法也是我們用來手工鎖定某些記錄的主要方法。比如,當我們在查詢某些記錄的過程中,不希望其他用戶對查詢的記錄進行更新操作,則可以發(fā)出這樣的語句。當數據使用完畢以后,直接發(fā)出rollback命令將鎖定解除。當表上添加了RS鎖定以后,不允許其他事務對相同的表添加排他鎖,但是允許其他的事務通過DML語句或lock命令鎖定相同表里的其他數據行。

select … from for update

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

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

lock table in share row exclusive mode

上述幾種鎖模式中,RS鎖是限制最少的鎖,X鎖是限制最多的鎖。當程序對所做的修改進行提交(Commit)或回滾(Rollback)后,鎖住的資源便會得到釋放,從而允許其他用戶進行操作。如果兩個事務,分別鎖定一部分數據,而都在等待對方釋放鎖才能完成事務操作,這種情況下就會發(fā)生死鎖。

下圖列出產生鎖定模式的SQL語句:

四、事務組成:

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

五、事務的分類:

1、顯式事務:

  • 顯式的調用DCL。
  • 只有用到COMMIT以后才會真正寫入數據庫,也持久化了。

2、隱式事務:

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

六、事務控制命令

1、提交事務

在執(zhí)行使用COMMIT語句可以提交事務,當執(zhí)行了COMMIT語句后,會確認事務的變化,結束事務,刪除保存點,釋放鎖。當使用COMMIT語句結束事務之后,其他會話將可以查看到事務變化后的新數據。

2、回滾事務

保存點(savepoint):是事務中的一點,用于取消部分事務,當結束事務時,會自動的刪除該事務所定義的所有保存點。當執(zhí)行ROLLBACK時,通過指定保存點可以回退到指定的點。

設置保存點:

Savepoint a;

刪除保存點:

Release Savepoint a;

回滾部分事務:

Rollback To a;

回滾全部事務:

Rollback;

七、示例

銀行轉帳的例子是最經典的事務示例:

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

    IF SQL%notfound THEN
        raise_application_error(-20001, '沒有該賬戶:' || &轉出賬戶);
    END IF;

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

  -- 向賬戶二加錢
    UPDATE account
    SET        balance = balance + v_money    WHERE        id = &轉入賬戶;

    IF SQL%notfound THEN
        raise_application_error(-20001, '沒有該賬戶:' || &轉入賬戶);
    END IF;

  -- 如果沒有異常,則提交事務

    COMMIT;
    dbms_output.put_line('轉賬成功');
EXCEPTION
    WHEN OTHERS THEN
        ROLLBACK; -- 出現異常則回滾事務
        dbms_output.put_line('轉賬失?。?);
        dbms_output.put_line(sqlerrm);
END;

到此這篇關于Oracle事務(transaction)的文章就介紹到這了。希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • Oracle數據回退的實現

    Oracle數據回退的實現

    在使用plsql工具,對表數據進行操作后,提交了事務,發(fā)現數據更新或者刪除錯了,這時候還是有方法可以把數據回退的,本文就詳細的介紹此方法,感興趣的可以了解一下
    2023-08-08
  • Oracle數據庫的啟動和關閉順序實例講解

    Oracle數據庫的啟動和關閉順序實例講解

    這篇文章主要介紹了Oracle數據庫的啟動和關閉順序實例講解的相關資料,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2016-07-07
  • windows本地安裝配置oracle客戶端完整流程(圖文版)

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

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

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

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

    Oracle的控制文件管理

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

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

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

    oracle 徹底刪除方法

    如果有個別DLL文件無法刪除的情況,則不用理會,重新啟動,開始新的安裝,安裝時,選擇一個新的目錄,則,安裝完畢并重新啟動后,老的目錄及文件就可以刪除掉了。
    2009-06-06
  • Oracle約束管理腳本

    Oracle約束管理腳本

    Oracle約束管理腳本...
    2007-03-03
  • oracle與gbase8s遷移數據類型對照以及舉例說明

    oracle與gbase8s遷移數據類型對照以及舉例說明

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

    Oracle賬戶被鎖錯誤:the?account?is?locked解決方法

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

最新評論