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