事務的特性 ACID
阿新 • • 發佈:2018-12-31
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