SQL server中事務的四個屬性特征(ACID)


事務的概念、類型和四個特征(ACID).


1.事務(Transaction)是並發控制的單位,是用戶定義的一個操作序列。這些操作要么都做,要么都不做,是一個不可分割的工作單位。 
通過事務,SQL Server能將邏輯相關的一組操作綁定在一起,以便服務器保持數據的完整性。


2.事務通常是以BEGIN TRANSACTION開始,以COMMIT或ROLLBACK結束。

    COMMIT表示提交,即提交事務的所有操作。具體地說就是將事務中所有對數據庫的更新寫回到磁盤上的物理數據庫中去,事務正常結束。

    ROLLBACK表示回滾,即在事務運行的過程中發生了某種故障,事務不能繼續進行,系統將事務中對數據庫的所有以完成的操作全部撤消,滾回到事務開始的狀態。

3.事務類型

    A:手動事務
            手動事務允許顯式處理若干過程,這些過程包括:開始事務、控制事務邊界內的每個連接和資源登記、確定事務結果(提交或中止)以及結束事務。
            盡管此模型提供了對事務的標准控制,但它缺少一些內置於自動事務模型的簡化操作。例如,在手動事務中數據存儲區之間沒有自動登記和協調。
            此外,與自動事務不同,手動事務中事務不在對象間流動。
            如果選擇手動控制分布式事務,則必須管理恢復、並發、安全性和完整性。也就是說,必須應用維護與事務處理關聯的 ACID 屬性所需的所有編程方法。

    B:自動事務
            .NET 頁、XML Web services方法或 .NET Framework 類一旦被標記為參與事務,它們將自動在事務范圍內執行。
            您可以通過在頁、XML Web services 方法或類中設置一個事務屬性值來控制對象的事務行為。特性值反過來確定實例化對象的事務性行為。
            因此,根據聲明特性值的不同,對象將自動參與現有事務或正在進行的事務,成為新事務的根或者根本不參與事務。
            聲明事務屬性的語法在 .NET Framework 類、.NET 頁和 XML Web services 方法中稍有不同。
            聲明性事務特性指定對象如何參與事務,如何以編程方式被配置。
            盡管此聲明性級別表示事務的邏輯,但它是一個已從物理事務中移除的步驟。
            物理事務在事務性對象訪問數據庫或消息隊列這樣的數據資源時發生。
            與對象關聯的事務自動流向合適的資源管理器,諸如 OLE DB、開放式數據庫連接 (ODBC) 或 ActiveX 數據對象 (ADO) 的關聯驅動程序在對象的上下文中查找事務,
            並通過分布式事務處理協調器 (DTC) 在此事務中登記。整個物理事務自動發生。

4.事務的特性(ACID特性)

    A:原子性(Atomicity)
    事務是數據庫的邏輯工作單位,事務中包括的諸操作要么全做,要么全不做。
    事務在執行過程中發生錯誤,會被回滾(Rollback)到事務開始前的狀態,就像這個事務從來沒有執行過一樣。

    B:一致性(Consistency)
    事務執行的結果必須是使數據庫從一個一致性狀態變到另一個一致性狀態。一致性與原子性是密切相關的。
    一個事務可以封裝狀態改變(除非它是一個只讀的)。事務必須始終保持系統處於一致的狀態,不管在任何給定的時間並發事務有多少。
    也就是說:如果事務是並發多個,系統也必須如同串行事務一樣操作。其主要特征是保護性和不變性(Preserving an Invariant).
    以轉賬案例為例,假設有五個賬戶,每個賬戶余額是100元,那么五個賬戶總額是500元,如果在這個5個賬戶之間同時發生多個轉賬,無論並發多少個,
    比如在A與B賬戶之間轉賬5元,在C與D賬戶之間轉賬10元,在B與E之間轉賬15元,五個賬戶總額也應該還是500元,這就是保護性和不變性.

    C:隔離性(Isolation)
    一個事務的執行不能被其他事務干擾。隔離狀態執行事務,使它們好像是系統在給定時間內執行的唯一操作。如果有兩個事務,運行在相同的時間內,
    執行相同的功能,事務的隔離性將確保每一事務在系統中認為只有該事務在使用系統。這種屬性有時稱為串行化,為了防止事務操作間的混淆,
    必須串行化或序列化請求,使得在同一時間僅有一個請求用於同一數據。

    D:持續性/永久性(Durability)
        一個事務一旦提交,它對數據庫中數據的改變就應該是永久性的,不會被回滾。

5.例子:

    A:比如說在網上轉帳從A賬戶往B賬戶轉100元,需要執行兩個操作A賬戶減少100元,B賬戶增加100元。
    這兩個操作如果只執行了第一個操作,那么你是不會答應的,因為你損失了100元,而如果只執行了第二個操作,那么銀行也不會答應。
    這兩個操作要么都同時執行成功,要么都執行失敗,否則一個成功,一個失敗都是不合理的。
    因此將這兩個操作放在一個事務中去執行,事務的原子性,保證了要么都執行,要么都不執行。

    B:一致性的話,再舉個例子,比如說你刷卡買電影票,步驟是這樣的,首先營業員先給你打出一張票,然后你刷卡,拿電影票。
    這個時候,實際的電影票是資源,而數據庫中的電影票是數據。營業員如果幫你打出一張票,這個時候,數據庫中電影票實際上數目減一了,
    但是如果你刷卡失敗了,實際的電影票資源並沒有發生改變,這個時候執行回滾操作,恢復到打票之前的數據。這樣保證了資源和數據的一致性。

    C:隔離性的話,就是兩個事務之間的操作相互之間不會影響,即不會發生臟讀、不可重復讀和幻象。

    D:持久性的話比較好理解,就是事務執行成功以后,數據將保存在數據庫中不再發生改變。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM