什麼是事務 1. 不可分割的操作,假設該操作有ABCD四個步驟組成. 2. 若ABCD四個步驟都成功完成,則認為事務成功. 3. 若ABCD中任意一個步驟操作失敗,則認為事務失敗 4. 每條sql語句都是一個事務 5. 事務只對DML語句有效,對於DQL無效 事務的ACID 原子性(Atomicit ...
什麼是事務
- 不可分割的操作,假設該操作有ABCD四個步驟組成.
- 若ABCD四個步驟都成功完成,則認為事務成功.
- 若ABCD中任意一個步驟操作失敗,則認為事務失敗
- 每條sql語句都是一個事務
- 事務只對DML語句有效,對於DQL無效
事務的ACID
原子性(Atomicity)
原子性是指事務包含的所有操作要麼全部成功,要麼全部失敗回滾
一致性(Consistency)
- 一致性是指事務必須使資料庫從一個一致性狀態變換到另一個一致性狀態,也就是說一個事務執行之前和執行之後都必須處於一致性狀態。
- 讓數據保持一定上的合理
- 一個商品出庫時,倉庫商品數量減1,對應用戶的購物車中商品加1
隔離性(Isolation)
隔離性是當多個用戶併發訪問資料庫時,比如操作同一張表時,資料庫為每一個用戶開啟的事務,不能被其他事務的操作所干擾,多個併發事務之間要相互隔離。
持久性(Durability)
持久性是指一個事務一旦被提交了,就不能再回滾了,已經把數據保存到資料庫當中了。
事務的使用
- 開啟事務:start transaction
- 提交事務:commit 所有語句全部執行完畢,沒有發生異常,提交事務,更新到資料庫當中。
- 回滾事務:rollback 當遇到一突發情況,撤銷執行的sql語句
執行流程
事務的併發問題
更新丟失
- 兩個或多個事務選擇同一行,然後基於最初選定的值更新該行時,
- 由於每個事務都不知道其它事務的存在 , 就會發生丟失更新 問題,
- 最後 的更新覆蓋了其它事務所做的更新
臟讀
舉例:
- 老闆要給程式員發工資,程式員的工資是3.6萬/月。
- 但是發工資時老闆不小心按錯了數字,按成3.9萬/月,該錢已經打到程式員的戶口,但是事務還沒有提交,
- 就在這時,程式員去查看自己這個月的工資,發現比往常多了3千元,以為漲工資了非常高興。
- 但是老闆及時發現了不對,馬上回滾差點就提交了的事務,將數字改成3.6萬再提交
- 實際程式員這個月的工資還是3.6萬,但是程式員看到的是3.9萬。他看到的是老闆還沒提交事務時的數據。這就是臟讀。
- 事務A讀到了事務B已修改,但尚未提交的數據
- 解決辦法 Read committed!讀提交,能解決臟讀問題
不可重覆讀
舉例:
- 程式員拿著工資卡(卡裡當然是只有3.6萬),當他買單時(程式員事務開啟),收費系統事先檢測到他的卡裡有3.6萬,
- 就在這個時候!!程式員的妻子要把錢全部轉出充當家用,並提交。
- 當收費系統準備扣款時,再檢測卡裡的金額,發現已經沒錢了。程式員就會很鬱悶,明明卡裡是有錢的…
- 一個事務範圍內兩個相同的查詢卻返回了不同數據,這就是不可重覆讀
- 事務A讀取到了事務B已經提交的修改數據
- 解決辦法 Repeatable read
重覆讀
舉例:
- 程式員拿著工資卡(卡裡還是有3.6萬),當他買時(事務開啟,不允許其他事務的UPDATE修改操作),收費系統事先檢測到他的卡裡有3.6萬。
- 這個時候他的妻子不能轉出金額了。接下來收費系統就可以扣款了。
幻讀
- 程式員某一天去消費,花了2千元,然後他的妻子去查看他今天的消費記錄(妻子事務開啟) 看到確實是花了2千元,就在這個時候,程式員花了1萬買了一部電腦,即新增INSERT了一條消費記錄,並提交。
- 當妻子列印程式員的消費記錄清單時(妻子事務提交),發現花了1.2萬元,似乎出現了幻覺,這就是幻讀。
- 解決辦法:Serializable 但是這種事務隔離級別效率低下,比較耗資料庫性能,一般不使用。
對應關係
- 事務隔離級別 臟讀 不可重覆讀 幻讀
- 讀未提交(read-uncommitted) 是 是 是
- 不可重覆讀(read-committed) 否 是 是
- 可重覆讀(repeatable-read) 否 否 是
- 串列化(serializable) 否 否 否
事務隔離級別
- Read uncommitted:就是一個事務可以讀取另一個未提交事務的數據
- Read committed:一個事務要等另一個事務提交後才能讀取數據
- Repeatable read:就是在開始讀取數據(事務開啟)時,不再允許修改操作
- Serializable :在該級別下,事務串列化順序執行,可以避免臟讀、不可重覆讀與幻讀
查看隔離級別
select @@global.tx_isolation,@@tx_isolation;
設置隔離級別
- 全局的
set global transaction isolation level read committed;
- 當前會話
set session transaction isolation level read committed;