MySQL事務(wù)與隔離級(jí)別的使用基礎(chǔ)理論
什么是事務(wù)
事務(wù)就是一組操作的集合,事務(wù)將整組操作作為一個(gè)整體,共同提交或者共同撤銷(xiāo)
這些操作只能同時(shí)成功或者同時(shí)失敗,成功即可提交事務(wù),失敗就執(zhí)行事務(wù)回滾
MySQL的事務(wù)默認(rèn)是自動(dòng)提交的,一條語(yǔ)句執(zhí)行成功,MySQL將會(huì)隱式的提交事務(wù)
以轉(zhuǎn)賬為例,張三向李四轉(zhuǎn)賬1000元
這個(gè)整體行為包含三個(gè)操作:首先查詢張三賬戶的余額,其次將張三賬戶余額-1000,最后將李四賬戶余額+1000。事務(wù)就是將這三個(gè)操作看作最小提交單元,就是一榮俱榮一損俱損。
-- 查看事務(wù)管理狀態(tài) 1-自動(dòng) 0-手動(dòng) select @@autocommit; -- 設(shè)置事務(wù)手動(dòng)管理 set @@autocommit = 0; -- 開(kāi)啟事務(wù) start transaction; -- 開(kāi)啟事務(wù):start transaction 或者 begin select money from account where name = '張三'; update account set money = money - 1000 where name = '張三'; update account set money = money + 1000 where name = '李四'; -- 事務(wù)提交 commit; -- 事務(wù)回滾 rollback;
事務(wù)四大特性ACID
原子性Atomicity:一組操作為最小執(zhí)行單元,只能全部執(zhí)行成功或者全部失敗
一致性Consistency:事務(wù)完成后,所有數(shù)據(jù)都要保持一致?tīng)顟B(tài)
一致性表示事務(wù)完成后,數(shù)據(jù)操作前后符合邏輯運(yùn)算,狀態(tài)一致
隔離性Isolation:是指在并發(fā)操作數(shù)據(jù)庫(kù)時(shí),各個(gè)事務(wù)之間不會(huì)相互影響
持久性Durability:事務(wù)一旦提交或回滾,對(duì)于數(shù)據(jù)庫(kù)的修改將會(huì)永久保存
并發(fā)事務(wù)問(wèn)題
臟讀
兩個(gè)事務(wù)A和B在并發(fā)下操作數(shù)據(jù)庫(kù)中的同一數(shù)據(jù)時(shí),當(dāng)事務(wù)A對(duì)數(shù)據(jù)進(jìn)行了修改但是還沒(méi)有commit的同時(shí),事務(wù)B對(duì)該數(shù)據(jù)進(jìn)行了select,此時(shí)事務(wù)B讀取到的數(shù)據(jù)就是不準(zhǔn)確的。這種情況叫做臟讀
事務(wù)B讀取到了事務(wù)A修改但還未提交的數(shù)據(jù)---->臟讀
不可重復(fù)讀
同樣事務(wù)AB并發(fā)下操作數(shù)據(jù)庫(kù)中同一數(shù)據(jù),首先事務(wù)A對(duì)該數(shù)據(jù)進(jìn)行查詢,查詢之后又進(jìn)行了其他操作。與此同時(shí),事務(wù)B執(zhí)行了更新操作并且成功commit。那么當(dāng)事務(wù)A再次對(duì)數(shù)據(jù)庫(kù)查詢的時(shí)候就會(huì)出現(xiàn)與上次讀取到的數(shù)據(jù)不一致的情況
幻讀
事務(wù)AB并發(fā)下操作數(shù)據(jù)庫(kù)中同一數(shù)據(jù),事務(wù)A首先查詢了數(shù)據(jù)庫(kù)中是否有id=1的數(shù)據(jù),沒(méi)有就插入。那么此時(shí)事務(wù)A未查詢到該數(shù)據(jù)存在,同時(shí)事務(wù)B執(zhí)行了插入操作插入了id=1的數(shù)據(jù)并且提交。那么事務(wù)A再去插入的時(shí)候則會(huì)報(bào)主鍵沖突的錯(cuò)誤,但是當(dāng)事務(wù)A再一次去查的時(shí)候發(fā)現(xiàn)id=1的數(shù)據(jù)仍然是不存在( 前提是已經(jīng)解決了不可重復(fù)讀的問(wèn)題,一個(gè)事務(wù)多次訪問(wèn)同一數(shù)據(jù)的結(jié)果是一致的 ),這種情況就稱之為幻讀
事務(wù)隔離級(jí)別
隔離級(jí)別
隔離級(jí)別 | 臟讀 | 不可重復(fù)讀 | 幻讀 |
---|---|---|---|
Read uncommitted(讀未提交) | × | × | × |
Read committed(oracle默認(rèn))(讀已提交) | √ | × | × |
Repeatable Read(mysql默認(rèn))(可重復(fù)讀) | √ | √ | × |
Serializable(可序化) | √ | √ | √ |
× --> 無(wú)法解決 √ --> 可以解決
在sql中查看當(dāng)前事務(wù)隔離級(jí)別
select @@transaction_isolation;
設(shè)置當(dāng)前事務(wù)隔離級(jí)別
-- 設(shè)置事務(wù)隔離級(jí)別 set [session|global] transaction isolation level {Read uncommitted | Read committed | Repeatable Read |Serializable};
session是指盡在當(dāng)前會(huì)話中使用該事務(wù)隔離級(jí)別,global表示全局有效
四種事務(wù)隔離級(jí)別當(dāng)中,Serializable可序化級(jí)別最高。要求序列化執(zhí)行sql指令,事務(wù)只能一個(gè)接一個(gè)的執(zhí)行,不允許并發(fā)執(zhí)行。性能低下
而Read Uncommitted讀未提交性能最好,但是存在臟讀問(wèn)題等
到此這篇關(guān)于MySQL事務(wù)與隔離級(jí)別的使用基礎(chǔ)理論的文章就介紹到這了,更多相關(guān)MySQL事務(wù)與隔離級(jí)別內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
MySQL數(shù)據(jù)類型中DECIMAL的用法實(shí)例詳解
這篇文章主要介紹了MySQL數(shù)據(jù)類型中DECIMAL的用法實(shí)例詳解的相關(guān)資料,希望通過(guò)本文能幫助到大家,需要的朋友可以參考下2017-10-10mysql中int(3)和int(10)的數(shù)值范圍是否相同
依稀還記得有次面試,有面試官問(wèn)我int(10)與int(11)有什么區(qū)別,當(dāng)時(shí)覺(jué)得就是長(zhǎng)度的區(qū)別吧,后來(lái)發(fā)現(xiàn)事情不是這么簡(jiǎn)單,這篇文章主要給大家介紹了關(guān)于mysql中int(3)和int(10)的數(shù)值范圍是否相同的相關(guān)資料2021-10-10MySQL里的found_row()與row_count()的解釋及用法
MySQL中有兩個(gè)函數(shù)來(lái)計(jì)算上一條語(yǔ)句影響了多少行,不同于SqlServer/Oracle,不要因?yàn)榇朔矫娴牟町惗鸸δ軉?wèn)題2013-02-02MySQL主從復(fù)制與讀寫(xiě)分離原理及用法詳解
這篇文章主要介紹了MySQL主從復(fù)制與讀寫(xiě)分離原理及用法,結(jié)合實(shí)例形式詳細(xì)分析了mysql數(shù)據(jù)庫(kù)主從復(fù)制、讀寫(xiě)分離基本概念、原理、用法及操作注意事項(xiàng),需要的朋友可以參考下2020-01-01mysql安全啟動(dòng)腳本mysqld_safe詳細(xì)介紹
這篇文章主要介紹了mysql安全啟動(dòng)腳本mysqld_safe詳細(xì)介紹,mysqld_safe增加了一些安全特性,需要的朋友可以參考下2014-07-07mysql數(shù)據(jù)庫(kù)中1045錯(cuò)誤的解決方法
這篇文章主要為大家詳細(xì)介紹了MySQL數(shù)據(jù)庫(kù)中1045錯(cuò)誤的解決方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-12-12mysql5.7.19 winx64安裝配置方法圖文教程(win10)
這篇文章主要為大家詳細(xì)介紹了mysql5.7.19 winx64安裝配置教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-07-07