1、四大特性:
A 原子性:對數據的一組操作,要么執行成功,要么不執行
C 一致性:事務前后的狀態要保持一致,可以理解為數據的一致性
I 隔離性:多個事務之間是隔離的,互不影響
D 持久性:事務中對數據庫執行的修改操作都將在磁盤上保留下來
? 只有保證了原子性、隔離性、持久性才能保證事務的一致性。
2、事務的狀態:
- 活動的(active):事務對應的數據庫操作正在執行過程中時,我們就說該事務處在活動的狀態。
- 部分提交的(partially committed):當事務中的最后一個操作執行完成,但由于操作都在內存中執行,所造成的影響并沒有刷新到磁盤時,我們就說該事務處在部分提交的狀態。
- 失敗的(failed):當事務處在活動的或者部分提交的狀態時,可能遇到了某些錯誤(數據庫自身的錯誤、操作系統錯誤或者直接斷電等)而無法繼續執行,或者人為的停止當前事務的執行,我們就說該事務處在失敗的狀態。
- 中止的(aborted):如果事務執行了半截而變為失敗的狀態,比如我們前邊嘮叨的狗哥向貓爺轉賬的事務,當狗哥賬戶的錢被扣除,但是貓爺賬戶的錢沒有增加時遇到了錯誤,從而當前事務處在了失敗的狀態,那么就需要把已經修改的狗哥賬戶余額調整為未轉賬之前的金額,換句話說,就是要撤銷失敗事務對當前數據庫造成的影響。書面一點的話,我們把這個撤銷的過程稱之為回滾。當回滾操作執行完畢時,也就是數據庫恢復到了執行事務之前的狀態,我們就說該事務處在了中止的狀態。
- 提交的(committed):當一個處在部分提交的狀態的事務將修改過的數據都同步到磁盤上之后,我們就可以說該事務處在了提交的狀態。
隨著事務對應的數據庫操作執行到不同階段,事務的狀態也在不斷變化,一個基本的狀態轉換圖如下所示:
? 從圖中大家也可以看出了,只有當事務處于提交的或者中止的狀態時,一個事務的生命周期才算是結束了。對于已經提交的事務來說,該事務對數據庫所做的修改將永久生效,對于處于中止狀態的事務,該事務對數據庫所做的所有修改都會被回滾到沒執行該事務之前的狀態。
3、事務的原理:
- 使用undo log(回滾日志)保證事務的原子性
- 使用redo log(重做日志)保證事務的持久性
- 使用鎖機制、MVCC等手段保證事務的隔離性