什么是事務
- 不可分割的操作,假設該操作有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;
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/48504.html
標籤:MySQL
上一篇:mysql常用函式
下一篇:mysql權限操作
