mysql事务中怎么更改空值_MySQL事务
1.事務
1.事務特性--ACID
Atomicity(原子性):要么全做,要么不做,不能只做一半(銀行轉賬)
Consistency(約束性):事務的前后,約束都能滿足
Isolation(依賴性):事務之間是獨立的,互不影響的
Durability(持久性):事務執行之后,事物的結果可以持久保存
2.事務隔離級別:
read uncommitted:可以讀到未提交的事務結果
read committed:只能讀已提交事務的結果
repeatable reads:可以讀到開啟事務時的值
serializable:兩個事務同時發生,必定是有先后的
3.實踐操作的準備
使用Join and Group中兩個表,向product表中新添一個字段count,用來記錄產品數量
2.Read Commit
預熱:查詢一下當前數據庫的事務隔離級別,保證事務隔離級別是read-commited
我的數據庫是Mysql5.5,默認事務隔離級別是repeatable-read,所以將其修改為read-commited
1.首先開啟兩個事務--事務A,事務B(注意這里如果使用可視化界面,例如Heidi,可能兩個窗口并不是真正的開啟了兩個事務,所以建議使用cmd來測試)
開啟事務A -> 將自動提交設為否(似乎5.5以上版本事務隔離級別高,不自動提交) -> 查詢productId=4的count
事務A:
開啟事務B,執行與事務A同樣的操作
事務B:
2.在事務B中操作,將productId=4的count更改為49,但是不提交事務
事務B:
3.此時在事務A中查詢一下count值,看在事務B更改數據但是未提交的情況下,事務A是否能查看到更新后的數據
事務A:
結果:事務A不能查看到事務B未提交的數據
4.將事務B提交,操作事務A,看是否能查詢到更新后的數據
事務A:
結果:事務B提交后,事務A能查詢到更新后的數據了
結論:當事務隔離級別為read-commited時,一個事務只能讀取到另一事務已提交的數據
3.Repeatable-read
預熱:查詢并將事務隔離級別修改為repeatable-read,將數據庫中count字段初始化為50
1.分別在開啟事務A,事務B
事務A:
事務B:
2.在事務B端更改count值,但是不提交事務
事務B:
操作事務A查詢count,發現查詢結果沒變
事務A:
3.提交事務B,并且操作事務A查看count,發現查詢到的count值依然沒變
事務B:
事務A:
結論:當事務隔離級別為repeatable-read時,一個事務只能讀到開啟本事務時讀到的數據,無法讀取其他事務更新的數據
4.Serializable
預熱:查詢并將事務隔離級別更改為serializable,將product表中count更改為50
1.分別開啟事務A,事務B
2.在事務B端執行更新操作
事務B:發現沒有一直處于執行中,并沒有執行成功
2.將事務A提交后,發現事務B更新成功
事務A:
事務B:
3.再提交事務B,操作事務A
事務B:
事務A:
結論:在serilizalbe級別下,select語句不僅會開啟事務,還會降數據鎖上,只允許其他事務查詢,不允許更改
5.For update
事務隔離級別沒必要提升到serilizable,只需要使用read-committed,select語句加for update即可
預熱:將事務隔離級別更改為read-committed
1.開啟事務A,并將查詢語句中加入for update
事務A:
事務B:
結果:只有當事務A提交之后,事務B才能查詢到數據
結論:在select語句中加入for update時,只有當次事務提交之后,其他事務才能查詢數據,for update會將數據加鎖,防止其他事務操作發生數據不一致
6.樂觀鎖
在語句中加入版本控制,如果版本是當前版本則可以進行修改,否則進行回滾,還有加鎖可是很浪費時間的哦
轉發一篇文章悲觀鎖和樂觀鎖;,自己很喜歡的公眾號---碼農翻身
7.例題
總結
以上是生活随笔為你收集整理的mysql事务中怎么更改空值_MySQL事务的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql插入另一个表中数据_MySql
- 下一篇: mysql自定义函数多参数_自定义mys