什麼是事務、事務特性、事務隔離級別、spring事務傳播特性?

趙鈺瑩發表於2018-08-09

什麼是事務

事務是程式中一系列嚴密的操作,所有操作執行必須成功完成,否則在每個操作所做的更改將會被撤銷,這也是事務的原子性(要麼成功,要麼失敗)。

事務特性

事務特性分為四個:原子性(Atomicity)、一致性(Consistency)、隔離性(Isolation)、持續性(Durability)簡稱ACID。

  1. 原子性(Atomicity):事務是資料庫邏輯工作單元,事務中包含的操作要麼都執行成功,要麼都執行失敗。

  2. 一致性(Consistency):事務執行的結果必須是使資料庫資料從一個一致性狀態變到另外一種一致性狀態。當事務執行成功後就說資料庫處於一致性狀態。如果在執行過程中發生錯誤,這些未完成事務對資料庫所做的修改有一部分已寫入物理資料庫,這是資料庫就處於不一致狀態。

  3. 隔離性(Isolation):一個事務的執行過程中不能影響到其他事務的執行,即一個事務內部的操作及使用的資料對其他事務是隔離的,併發執行各個事務之間無不干擾。

  4. 持續性(Durability):即一個事務執一旦提交,它對資料庫資料的改變是永久性的。之後的其它操作不應該對其執行結果有任何影響。

事務的隔離級別

事務的隔離級別也分為四種,由低到高依次分別為:read uncommited(讀未提交)、read commited(讀提交)、read repeatable(讀重複)、serializable(序列化),這四個級別可以逐個解決髒讀、不可重複讀、幻讀這幾類問題。

  1. read uncommited:是最低的事務隔離級別,它允許另外一個事務可以看到這個事務未提交的資料。

  2. read commited:保證一個事物提交後才能被另外一個事務讀取。另外一個事務不能讀取該事物未提交的資料。

  3. repeatable read:這種事務隔離級別可以防止髒讀,不可重複讀。但是可能會出現幻象讀。它除了保證一個事務不能被另外一個事務讀取未提交的資料之外還避免了以下情況產生(不可重複讀)。

  4. serializable:這是花費最高代價但最可靠的事務隔離級別。事務被處理為順序執行。除了防止髒讀,不可重複讀之外,還避免了幻象讀。

  5. 髒讀、不可重複讀、幻象讀概念說明:

    • 髒讀:指當一個事務正字訪問資料,並且對資料進行了修改,而這種資料還沒有提交到資料庫中,這時,另外一個事務也訪問這個資料,然後使用了這個資料。因為這個資料還沒有提交那麼另外一個事務讀取到的這個資料我們稱之為髒資料。依據髒資料所做的操作肯能是不正確的。

    • 不可重複讀:指在一個事務內,多次讀同一資料。在這個事務還沒有執行結束,另外一個事務也訪問該同一資料,那麼在第一個事務中的兩次讀取資料之間,由於第二個事務的修改第一個事務兩次讀到的資料可能是不一樣的,這樣就發生了在一個事物內兩次連續讀到的資料是不一樣的,這種情況被稱為是不可重複讀。

    • 幻象讀:一個事務先後讀取一個範圍的記錄,但兩次讀取的紀錄數不同,我們稱之為幻象讀(兩次執行同一條 select 語句會出現不同的結果,第二次讀會增加一資料行,並沒有說這兩次執行是在同一個事務中)

spring事務傳播特性

事務傳播行為就是多個事務方法相互呼叫時,事務如何在這些方法間傳播。spring支援7種事務傳播行為:

    • propagation_requierd:如果當前沒有事務,就新建一個事務,如果已存在一個事務中,加入到這個事務中,這是最常見的選擇。

    • propagation_supports:支援當前事務,如果沒有當前事務,就以非事務方法執行。

    • propagation_mandatory:使用當前事務,如果沒有當前事務,就丟擲異常。

    • propagation_required_new:新建事務,如果當前存在事務,把當前事務掛起。

    • propagation_not_supported:以非事務方式執行操作,如果當前存在事務,就把當前事務掛起。

    • propagation_never:以非事務方式執行操作,如果當前事務存在則丟擲異常。

    • propagation_nested:如果當前存在事務,則在巢狀事務內執行。如果當前沒有事務,則執行與propagation_required類似的操作

Spring 預設的事務傳播行為是 PROPAGATION_REQUIRED,它適合於絕大多數的情況。假設 ServiveX#methodX() 都工作在事務環境下(即都被 Spring 事務增強了),假設程式中存在如下的呼叫鏈:Service1#method1()->Service2#method2()->Service3#method3(),那麼這 3 個服務類的 3 個方法通過 Spring 的事務傳播機制都工作在同一個事務中。


【本文轉載自華為雲社群,作者 凌洛 ,原文 連結:https://bbs.huaweicloud.com/blogs/73b7ba179aa411e89fc57ca23e93a89f】

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31077337/viewspace-2199571/,如需轉載,請註明出處,否則將追究法律責任。

相關文章