一、事務
簡單點說,事務就是一件事情。所有與事務相關的內容都是圍繞這一件事情展開的。
二、事務的特性:ACID
A:Atomicity(原子性),事務必須是一個不可分割的整體。
C:Consistency(一致性),執行完數據庫操作後,數據不會被破壞。如:從 A 賬戶轉賬到 B,要保證 A 賬戶扣錢後,B 賬戶能增加對應的錢數。
I:Isolation(隔離性),多個人對同一條數據同時進行操作時,若不加以控制,會產生非常大的麻煩。而這個控制就是指隔離性。
D:Durability(持久性),若執行一條 insert 語句,數據庫必須保證一條數據永久地存放到數據庫中。
事務的 ACID 特性,都是為了保證數據的一致性。隔離性是保證事務一致性的手段。
三、事務的隔離級別(Transanction Isolation Level)
上面說過,事務的隔離性。所說的控制,就是指這裡的隔離級別。
(1)READ_UNCOMMITED:讀未提交
(2)READ_COMMITED:讀已提交
(3)REPEATABLE_READ:可重復讀
(4)SERIALIZABLE:
從上往下,並發性越來越差,安全性越來越高。
四、事務中存在的問題
(1)髒讀——事務 A 讀取了事務 B 未提交的數據,並在這個基礎上又做了其他操作。
(2)不可重復讀——事務 A 讀取了事務 B 已提交的更改數據。
(3)幻讀——事務 A 讀取事務 B 已提交的新增的數據。
不論是在什麼情況下,髒讀都是不被允許的。
五、事務的隔離級別與事務中存在的問題的對應關系
其實事務的隔離級別的存在本身就是為了解決事務中出現的問題。
MySQL 默認的隔離級別為 READ_COMMITED。
需要提醒的是,這裡所說的事務隔離級別規范是 JDBC 提出來的。
到數據庫級,隔離級別是通過鎖來控制的,當插入數據時,鎖定表,叫“鎖表”。當更新數據時,鎖定行,叫“鎖行”。
六、總結為一張圖