Mysql事務的特性
事務是作爲一個邏輯單元執行的一系列操作,一個邏輯工作單元必須有四個屬性,稱爲 ACID (** 原子性(Atomicity,或稱不可分割性)、一致性(Consistency)、隔離性(Isolation,又稱獨立性)、持久性(Durability)**)屬性,只有這樣才能稱爲一個事務:
- 原子性:一個事務(transaction)中的所有操作,要麼全部完成,要麼全部不完成,不會結束在中間某個環節。事務在執行過程中發生錯誤,會被回滾(Rollback)到事務開始前的狀態,就像這個事務從來沒有執行過一樣。
- 一致性:在事務開始之前和事務結束以後,數據庫的完整性沒有被破壞。這表示寫入的資料必須完全符合所有的預設規則,這包含資料的精確度、串聯性以及後續數據庫可以自發性地完成預定的工作。
- 隔離性:數據庫允許多個併發事務同時對其數據進行讀寫和修改的能力,隔離性可以防止多個事務併發執行時由於交叉執行而導致數據的不一致。事務隔離分爲不同級別,包括讀未提交(Read uncommitted)、讀提交(read committed)、可重複讀(repeatable read)和串行化(Serializable)。
- 持久性:事務處理結束後,對數據的修改就是永久的,即便系統故障也不會丟失。begin開始一個事務,rollback事務回滾,commit事務確認。
Mysql 的髒讀、不可重複讀和幻讀
- 髒讀:事務A讀取了事務B更新的數據,然後B回滾操作,那麼A讀取的數據是髒數據。
- 不可重複讀:事務A多次讀取同一數據,事務B在事務A多次讀取的過程中,對數據做了更新並提交,導致事務A多次讀取同一數據時,結果不一致。
- 幻讀:系統管理員A將數據庫中的所有學生的成績從具體分數改爲ABCD等級,但是系統管理員B就在這個時候插入了一條具體的分數的記錄,當系統管理員A改結束後還有一條記錄沒有改過來,就好像發生了幻覺一樣,這就叫幻讀。這樣就會導致當A本來執行的結果包含B執行的結果,這兩個本來是不相關的,對於A來說就相當於產生了“幻覺”。
小結:不可重複讀的和幻讀很容易混淆,不可重複讀側重於修改,幻讀側重於新增或刪除。解決不可重複讀的問題只需鎖住滿足條件的行,解決幻讀需要鎖表
MySQL事務隔離級別
事務隔離級別 | 髒讀 | 不可重複讀 | 幻讀 |
---|---|---|---|
讀未提交(read-uncommitted) | ✔ | ✔ | ✔ |
不可重複讀(read-committed) | ✘ | ✔ | ✔ |
可重複讀(repeatable-read) | ✘ | ✘ | ✔ |
串行化(serializable) | ✘ | ✘ | ✘ |
mysql默認讀事務隔離級別是可重複讀(repeatable-read)
mysql> select @@tx_isolation;
+-----------------+
| @@tx_isolation |
+-----------------+
| REPEATABLE-READ |
+-----------------+
1 row in set (0.01 sec)
//設置隔離級別
set session transaction isolation level 設置事務隔離級別
//設置read uncommitted級別:
set session transaction isolation level read uncommitted;
//設置read committed級別:
set session transaction isolation level read committed;
//設置repeatable read級別:
set session transaction isolation level repeatable read;
//設置serializable級別:
set session transaction isolation level serializable;
?