數據庫四大特性ACID
Atomicity (原子性) :事務(transaction)是由指邏輯上對數據的的一組操作,這組操作要么一次全部成功,如果這組操作全部失敗,是不可分割的一個工作單位。
Consistency(一致性) :在事務開始以前,被操作的數據的完整性處于一致性的狀態,事務結束后,被操作的數據的完整性也必須處于一致性狀態。
Isolation(隔離性) :事務隔離性要求系統必須保證事務不受其他并發執行的事務的影響
Durability(持久性): 一個事務一旦成功提交,它對數據庫的改變必須是永久的,即便是數據庫發生故障也應該不會對其產生任何影響。
并發事務中可能產生的問題
臟讀
兩個事務并發執行,一個事務處理過程中讀取了另一個未提交的事務中的數據
不可重復讀
兩個事務并發執行,一個事務范圍內多次查詢返回了不同的數據值,由于在查詢間隔,被另一個事務修改并提交了數據。不可重復讀和臟讀的區別是:臟讀是某一事務事務范圍內,在該事務的某次查詢中讀取了另一事務未提交的臟數據,而不可重復讀是某一事務范圍內,該事務第二次讀取數據,另一事務改變并提交了數據,導致該事務第二次讀取的數據不同于第一次讀取的數據。
虛讀(幻讀)
兩個事務并發執行,一個事務對符合某一特征的一批數據進行修改,另一事務此時插入了一條新的符合特征的數據,當進行修改的事務完成后再查看數據會發現有一條數據沒有被修改,此為幻讀。
幻讀和不可重復讀都是讀取了另一個已提交的事務(與臟讀不同),不同的是不可重復讀查詢的是同一個數據項,而幻讀針對的是一批數據整體。
mysql四個隔離級別
Read uncommitted (讀未提交)
一個事務可以讀取另一個事務未提交的數據,會導致臟讀的發生。
Read committed (讀已提交)
若有事務對數據對數據進行更新操作,讀操作要等待更新事務提交后才能讀取數據,可以解決臟讀,無法解決不可重復讀。
Repeatable read (可重復讀)
某一事務在進行讀操作時,不允許其他事務進行修改操作。此時不允許修改操作,但是可能會有插入操作,即可能會有幻讀的情況。
Serializable(序列化)
最高的事務隔離級別,在該級別下事務串行化執行,有效避免臟讀,不可重復讀,幻讀,但是對數據庫性能影響比較大。