1. 程式人生 > >事務的特性 ACID

事務的特性 ACID

1. 事務的ACID

資料庫的事務必須具備ACID特性,ACID是指 Atomic(原子性)、Consistensy(一致性)、Isolation(隔離型)和Durability(永續性)的英文縮寫。

  • 原子性(Atomicity)
    事務包裝的一組sql,要麼都執行成功,要麼都失敗。這些操作是不可分割的。
  • 一致性(Consistency)
    資料庫的資料狀態是一致的。
    事務的成功與失敗,最終資料庫的資料都是符合實際生活的業務邏輯。一致性絕大多數依賴業務邏輯和原子性。
  • 永續性(Consistency)
    事務成功提交之後,對於資料庫的改變是永久的。哪怕資料庫發生異常,重啟之後資料亦然存在。
  • 隔離性
    一個事務的成功或者失敗對於其他的事務是沒有影響。2個事務應該相互獨立。
2. 事務的隔離級別

如果不考慮事務的隔離型,由於事務的併發,將會出現以下問題:
1、髒讀 – 最嚴重,杜絕發生
2、不可重複讀
3、幻讀(虛讀)

1.1髒讀
指一個事務讀取了另外一個事務 未提交的資料。
在這裡插入圖片描述
一個事務讀取了另一個事務沒有提交的資料,非常嚴重。應當儘量避免髒讀。

1.2不可重複讀
在一個事務內多次讀取表中的資料,多次讀取的結果不同。

在這裡插入圖片描述

1.3幻讀

在這裡插入圖片描述

隔離級別:解決問題

  • 資料庫規範規定了4種隔離級別,分別用於描述兩個事務併發的所有情況。
    1.read uncommitted 讀未提交,一個事務讀到另一個事務沒有提交的資料。
    存在:3個問題(髒讀、不可重複讀、虛讀)。
    解決:0個問題
    2.read committed 讀已提交,一個事務讀到另一個事務已經提交的資料。
    存在:2個問題(不可重複讀、虛讀)。
    解決:1個問題(髒讀)
    3.repeatable read
    可重複讀,在一個事務中讀到的資料始終保持一致,無論另一個事務是否提交。
    存在:1個問題(虛讀)。
    解決:2個問題(髒讀、不可重複讀)
    4.serializable 序列化,同時只能執行一個事務,相當於事務中的單執行緒。
    存在:0個問題。
    解決:3個問題(髒讀、不可重複讀、虛讀)

安全和效能對比
安全性:serializable > repeatable read > read committed > read uncommitted
效能 : serializable < repeatable read < read committed < read uncommitted

常見資料庫的預設隔離級別:
MySql:repeatable read
Oracle:read committed