數據庫事務
事務特性
SQL92標準定義了數據庫事務的四個特點:
- 原子性(Atomicity):一個事務裏面所有包含的SQL語句是一個執行整體,不可分割,要麼都做,要麼都不做。
- 一致性(Consistency):事務開始時,數據庫中的數據是一致的,事務結束時,數據庫的數據也應該是一致的。
- 隔離性(Isolation):是指數據庫允許多個併發事務同時對其中的數據進行讀寫和修改的能力,隔離性可以防止事務的併發執行時,由於他們的操作命令交叉執行而導致的數據不一致狀態。
- 持久性 (Durability) : 是指當事務結束後,它對數據庫中的影響是永久的,即便系統遇到故障的情況下,數據也不會丟失。
數據異常
- 髒讀:讀到的數據不是此刻的真實數據
- 不可重複讀:兩次讀到的數據不一樣
- 幻讀:原來沒有,現在有了
四種隔離級別
-
讀未提交:
允許
髒讀
,但不允許更新丟失 (排他寫鎖) 一個事務已經開始寫數據,另一個事務不允許同時進行寫操作
但允許其他事務讀此行修改後未提交的數據
SET GLOBAL TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
表現:可以讀取任何數據,但是如果更新到同一數據上,需要等待另一個事務執行完,有超時異常
-
讀提交:(Oracle默認)
允許
不可重複讀
,但不允許髒讀
(瞬間共享讀鎖,排他寫鎖) 讀數據的事務允許其他事務訪問這行數據
寫數據的事務在未提交前禁止其他事務訪問這行數據
SET GLOBAL TEANSACTION ISOLATION LEVEL READ COMMTTED
表現:對同一數據更新需要等待,一個事務如果沒有COMMIT,任何其它事務無法讀取它的中間值。因爲只是加了行共享鎖,所以此時,還是可以讀到一個事務里正在被update的數據。
-
可重複讀:(Mysql默認)
禁止
不可重複讀
和髒讀
,有時會出現幻影數據,innoDB 中此隔離級別不允許幻象讀。(共享寫鎖,排他寫鎖) 讀事務禁止寫事務
寫事務禁止其他事務
SET GLOBAL TRANSACTION ISOLATION LEVEL REPEATABLE READ
-
序列化:
讀也加鎖 ,要求事務序列化執行
在序列化隔離中,innodb會對每一個select語句後自動加上lock in share mode.
鎖:實際上只有兩種
- 共享鎖(Shared Lock) 也叫讀鎖
共享鎖表示對數據進行讀操作。因此多個事務可以同時爲一個對象加共享鎖。 - 寫鎖(Write Lock)也叫排它鎖
寫鎖表示對數據進行寫操作。如果一個事務對對象加了排他鎖,其他事務就不能再給它加任何鎖了。
鎖粒度 | 本連接查詢 | 本連接更新 | 其它連接查詢 | 其它連接insert | 其它連接update |
---|---|---|---|---|---|
LOCK TABLES 表名 READ; | 可以 | 不可以 | 可以 | 不可以 | 不可以 |
LOCK TABLES 表名 WRITE; | 可以 | 可以 | 不可以 | 不可以 | 不可以 |