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

1.什麼是事務:spring

事務是程序中一系列嚴密的操做,全部操做執行必須成功完成,不然在每一個操做所作的更改將會被撤銷,這也是事務的原子性(要麼成功,要麼失敗)。數據庫

2.事務特性:併發

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

  1. 原子性(Atomicity):事務是數據庫邏輯工做單元,事務中包含的操做要麼都執行成功,要麼都執行失敗。
  2. 一致性(Consistency):事務執行的結果必須是使數據庫數據從一個一致性狀態變到另一種一致性狀態。當事務執行成功後就說數據庫處於一致性狀態。若是在執行過程當中發生錯誤,這些未完成事務對數據庫所作的修改有一部分已寫入物理數據庫,這是數據庫就處於不一致狀態。
  3. 隔離性(Isolation):一個事務的執行過程當中不能影響到其餘事務的執行,即一個事務內部的操做及使用的數據對其餘事務是隔離的,併發執行各個事務之間無不干擾。
  4. 持續性(Durability):即一個事務執一旦提交,它對數據庫數據的改變是永久性的。以後的其它操做不該該對其執行結果有任何影響。

3.事務的隔離級別:3d

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

  1. read uncommited:是最低的事務隔離級別,它容許另一個事務能夠看到這個事務未提交的數據。
  2. read commited:保證一個事物提交後才能被另一個事務讀取。另一個事務不能讀取該事物未提交的數據。
  3. repeatable read:這種事務隔離級別能夠防止髒讀,不可重複讀。可是可能會出現幻象讀。它除了保證一個事務不能被另一個事務讀取未提交的數據以外還避免瞭如下狀況產生(不可重複讀)。
  4. serializable:這是花費最高代價但最可靠的事務隔離級別。事務被處理爲順序執行。除了防止髒讀,不可重複讀以外,還避免了幻象讀。
  5. 髒讀、不可重複讀、幻象讀概念說明:
    • 髒讀:指當一個事務正字訪問數據,而且對數據進行了修改,而這種數據尚未提交到數據庫中,這時,另一個事務也訪問這個數據,而後使用了這個數據。由於這個數據尚未提交那麼另一個事務讀取到的這個數據咱們稱之爲髒數據。依據髒數據所作的操做肯能是不正確的。
    • 不可重複讀:指在一個事務內,屢次讀同一數據。在這個事務尚未執行結束,另一個事務也訪問該同一數據,那麼在第一個事務中的兩次讀取數據之間,因爲第二個事務的修改第一個事務兩次讀到的數據多是不同的,這樣就發生了在一個事物內兩次連續讀到的數據是不同的,這種狀況被稱爲是不可重複讀。
    • 幻象讀:一個事務前後讀取一個範圍的記錄,但兩次讀取的紀錄數不一樣,咱們稱之爲幻象讀(兩次執行同一條 select 語句會出現不一樣的結果,第二次讀會增長一數據行,並無說這兩次執行是在同一個事務中)

spring事務傳播特性:事務

事務傳播行爲就是多個事務方法相互調用時,事務如何在這些方法間傳播。spring支持7種事務傳播行爲:ci

    • 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 的事務傳播機制都工做在同一個事務中。it

相關文章
相關標籤/搜索