一.什么是事務
事務是應用程序中一系列嚴密的操作,所有操作必須成功完成,否則在每個操作中所作的所有更改都會被撤消。也就是事務具有原子性,一個事務中的一系列的操作要么全部成功,要么一個都不做。
事務的結束有兩種,當事務中的所以步驟全部成功執行時,事務提交。如果其中一個步驟失敗,將發生回滾操作,撤消撤消之前到事務開始時的所以操作。
二.事務的 ACID
事務具有四個特征:原子性( Atomicity )、一致性( Consistency )、隔離性( Isolation )和持續性( Durability )。這四個特性簡稱為 ACID 特性。
1 、原子性
事務是數據庫的邏輯工作單位,事務中包含的各操作要么都做,要么都不做
2 、一致性
事 務執行的結果必須是使數據庫從一個一致性狀態變到另一個一致性狀態。因此當數據庫只包含成功事務提交的結果時,就說數據庫處於一致性狀態。如果數據庫系統 運行中發生故障,有些事務尚未完成就被迫中斷,這些未完成事務對數據庫所做的修改有一部分已寫入物理數據庫,這時數據庫就處於一種不正確的狀態,或者說是 不一致的狀態。
3 、隔離性
一個事務的執行不能其它事務干擾。即一個事務內部的操作及使用的數據對其它並發事務是隔離的,並發執行的各個事務之間不能互相干擾。
4 、持續性
也稱永久性,指一個事務一旦提交,它對數據庫中的數據的改變就應該是永久性的。接下來的其它操作或故障不應該對其執行結果有任何影響。
數據庫系統必須維護事務的以下特性 ( 簡稱 ACID) :
原子性 (Atomicity)
一致性 (Consistency)
隔離性 (Isolation)
持久性 (Durability)
事務中的所有操作要么全部執行,要么都不執行;
如果事務沒有原子性的保證,那么在發生系統
故障的情況下,數據庫就有可能處於不一致狀
態。
READ-UNCOMMITTED(讀取未提交): 最低的隔離級別,允許讀取尚未提交的數據變更,可能會導致臟讀、幻讀或不可重復讀
READ-COMMITTED(讀取已提交): 允許讀取並發事務已經提交的數據,可以阻止臟讀,但是幻讀或不可重復讀仍有可能發生
REPEATABLE-READ(可重復讀): 對同一字段的多次讀取結果都是一致的,除非數據是被本身事務自己所修改,可以阻止臟讀和不可重復讀,但幻讀仍有可能發生。
SERIALIZABLE(可串行化):最高的隔離級別,完全服從ACID的隔離級別。所有的事務依次逐個執行,這樣事務之間就完全不可能產生干擾,也就是說,該級別可以防止臟讀、不可重復讀以及幻讀
隔離級別 | 臟讀 | 不可重復讀 | 幻讀 |
READ-UNCOMMITTED | Y | Y | Y |
READ-COMMITTED | N | Y | Y |
REPEATABLE-READ | N | N | Y |
SERIALIZABLE | N | N | N |
不可重復讀的重點是修改,幻讀的重點在於新增或者刪除
讀未提交,臟讀
允許讀取尚未提交的數據變更,可能會導致臟讀、幻讀或不可重復讀
讀已提交,避免臟讀
允許讀取並發事務已經提交的數據,可以阻止臟讀,但是幻讀或不可重復讀仍有可能發生
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED; //上面例子修改成read committed,回滾修改成commit
可重復讀
對同一字段的多次讀取結果都是一致的,除非數據是被本身事務自己所修改,可以阻止臟讀和不可重復讀,但幻讀仍有可能發生
SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;
可串行化
第二個事物要修改,要等第一個事物修改提交
SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE;