事務隔離級別和Spirng事務傳播級別

事務的四個特性(ACID)

原子性

一個事務(transaction)中的全部操做,或者所有完成,或者所有不完成,不會結束在中間某個環節。事務在執行過程當中發生錯誤,會被回滾(Rollback)到事務開始前的狀態,就像這個事務歷來沒有執行過同樣。即,事務不可分割、不可約簡mysql

隔離性

數據庫容許多個併發事務同時對其數據進行讀寫修改的能力,隔離性能夠防止多個事務併發執行時因爲交叉執行而致使數據不一致。事務隔離分爲不一樣級別,包括讀未提交(Read uncommitted)、讀已提交(read committed)、可重複讀(repeatable read)和串行化/序列化(Serializable)。sql

一致性

在事務開始以前和事務結束之後,數據庫的完整性沒有被破壞。這表示寫入的資料必須徹底符合全部的預設約束、觸發器、級聯回滾等。數據庫

持久性

事務處理結束後,對數據的修改就是永久的,即使系統故障也不會丟失。併發

事務的隔離級別

讀未提交:read uncommited

  • 產生的問題:髒讀、幻讀、不可重複讀
  • 解決的問題:null

讀已提交:read commited

  • 產生的問題:幻讀、不可重複讀
  • 解決的問題:髒讀

可重複讀:repeatable read

  • 產生的問題:幻讀
  • 解決的問題:髒讀、不可重複讀

串行化(序列化):serializable

  • 產生的問題:null
  • 解決的問題:All
  • 隔離級別最高,效率最低

髒讀、幻讀、不可重複讀

1. 髒讀

一個事務讀到了另外一個事務未提交的數據(回滾)ui

2. 幻讀

是不可重複讀的一種特殊場景:當事務1兩次執行SELECT ... WHERE檢索必定範圍內數據的操做中間,事務2在這個表中建立了(如INSERT)了一行新數據,這條新數據正好知足事務1的「WHERE」子句。事務

給人的感受就像出現了幻覺同樣,以前明明不存在的數據,如今忽然出現了,被稱爲「幻讀」。資源

3. 不可重複讀

第一個事務兩次「讀取」過程當中,另外一個事務對一樣的數據進行更新,第一個事務兩次讀取結果不一致,因此被稱爲「不可重複讀」。it

數據庫默認隔離級別

  1. mysql:repeatable read(可重複讀
  2. Oracle:read commited(讀已提交

事務的傳播級別

  • MANDATORY:(mandatory:強制性) 以使用當前的事務,若是沒有事務,拋出異常
  • REQUERS_NEW:(requers_new)新建一個事務,若是存在事務,則掛起以前的事務
  • REQUIRED:(required)(增刪改)若是沒有事務,則新建一個事務;若是事務,加入這個事務當中
  • NESTED:(nested:嵌套)事務,嵌套執行,沒有事務,執行required
  • SUPPORTS:(supports)若是沒有事務,非事務執行,若是事務,加入這個事務當中
  • NOT_SUPPORTED:(not_supported)必須非事務執行,若是事務,則掛起事務
  • NEVER:(never)非事務執行,若是存在事務,拋出異常

PS:io

  1. 文章來自各類資源的整理(部分原創),若有侵權請告知刪除。
  2. 轉載本文請註明出處
相關文章
相關標籤/搜索