什么是事務
什么是事務?
當多個操作有這樣的要求時:要么都成功要么都失敗,這說明這多個操作必須在一個事務中,事務(Transaction)是訪問並可能更新數據庫中各種數據項的一個程序執行單元(unit)。
事務的四個特性?
- A:原子性(Atomicity)
事務中包括的諸操作要么全成功,要么全失敗。
- B:一致性(Consistency)
事務執行的結果必須是使數據庫從一個一致性狀態變到另一個一致性狀態。
也就是說事務執行之前數據庫數據處於正確狀態,執行之后也處理正確狀態,如果有些事務運行中發生故障,這些事務對數據庫所做的修改有一部分已寫入數據庫,這時數據庫就處於不正確的狀態即不一致的狀態。
一致性與原子性是密切相關的,如果事務沒有原子性的保證,那么在發生系統故障的情況下,數據庫就有可能處於不一致狀態。
- C:隔離性(Isolation)
一個事務的執行不能被其他事務干擾。解決多個線程並發操作事務情況,每個事務互相不影響
- D:持續性/永久性(Durability)
一個事務一旦提交,它對數據庫中數據的改變就應該是永久性的。
隔離級別
ANSI SQL 標准定義了隔離級別,但並不是SQL數據庫獨有.JTA也定義了同樣的隔離級別.級別越高,成本越高。
由事務隔離性引發幾種問題 ?
臟讀、 不可重復讀 、虛讀 、 丟失更新
n 臟讀: 一個事務讀取到另一個事務 未提交數據
n 不可重復讀: 一個事務中,先后讀取兩次,兩次讀取結果不同,讀取到了另一個事務已經提交的數據,此問題針對update更新來說。
n 虛讀: 一個事務,先后讀取兩次,結果不同,讀取到了另一個事務已經提交的數據 ,此問題針對insert插入來說。
n 丟失更新: 兩個事務 同時修改一條數據,后提交事務,覆蓋了之前提交事務結果(使用悲觀鎖和樂觀鎖處理,悲觀鎖性能太差,建議使用樂觀鎖)
| 隔離級別 |
含義 |
| READ_UNCOMMITTED |
允許你讀取還未提交的改變了的數據。可能導致臟、幻、不可重復讀 |
| READ_COMMITTED |
允許在並發事務已經提交后讀取。可防止臟讀,但幻讀和 不可重復讀仍可發生 |
| REPEATABLE_READ |
對相同字段的多次讀取是一致的,除非數據被事務本身改變。可防止臟、不可重復讀,但幻讀仍可能發生。 |
| SERIALIZABLE |
完全服從ACID的隔離級別,確保不發生臟、幻、不可重復讀。這在所有的隔離級別中是最慢的,它是典型的通過完全鎖定在事務中涉及的數據表來完成的。 |
事務的隔離級別 ,是由數據庫提供的 ,並不是所有數據庫都支持四種隔離級別
MySQL : READ_UNCOMMITTED、READ_COMMITTED、REPEATABLE_READ、SERIALIZABLE (默認 REPEATABLE_READ)
Oracle : READ_UNCOMMITTED、READ_COMMITTED、 SERIALIZABLE(默認 READ_COMMITTED )
在使用數據庫時候,隔離級別越高,安全性越高 ,性能越低
實際開發中,不會選擇最高或者最低隔離級別,選擇 READ_COMMITTED(oracle 默認)、REPEATABLE_READ (mysql默認)
