深入解析MySQL?事務
事務指邏輯上的一組操作,組成這組操作的各個單元,要么全部成功,要么全部失敗。
事務的四大特性 ( ACID )
原子性(Atomicity):一個事物是一個不可分割的單位,要么全都執(zhí)行,要么都不執(zhí)行;
一致性(Consistency):事務執(zhí)行前后,數(shù)據(jù)處于合法的狀態(tài);
持久性(Isolation):事務執(zhí)行完后,數(shù)據(jù)的修改是持久的,不會因為其他操作或故障而對其產(chǎn)生影響;
隔離性(Durability):多個事務并發(fā)執(zhí)行的,事務之間不互相干擾。
假如事物的一個操作整體(動作A,B),動作A,執(zhí)行完了,動作B,執(zhí)行到一半,執(zhí)行過程出錯,這時怎么辦?有回滾機制,有個日志會記錄這些操作,記錄數(shù)據(jù)修改前和數(shù)據(jù)修改后的值。
臟讀
事務A正在修改數(shù)據(jù)(但是沒有提交),事務B就讀取了這里的數(shù)據(jù),此時事務B讀取的操作稱為臟讀。 解決辦法:給寫操作加鎖,當事務A在寫數(shù)據(jù)的時候,事務B無法讀取。
不可重復讀
事務A修改數(shù)據(jù)之后提交了數(shù)據(jù)“name=L”,然后事務B就讀取數(shù)據(jù),但是此時A覺得修改的數(shù)據(jù)不滿意“name=H”,繼續(xù)修改提交了,此時事務B再次讀取,發(fā)現(xiàn),啊,怎么數(shù)據(jù)不一樣了。這就是不可重復讀的問題。 解決辦法:給寫操作加鎖的同時,給讀操作也加鎖,當事務A在寫的時候,事務B不可以讀,事物B在讀的時候,事物A也不可以寫。
幻讀
雖然已經(jīng)給寫操作加鎖,和讀操作加鎖,但是會有種情況,事務B在讀的時候,事務A無法修改name,但是事務A可以再寫一個age,當事務B再次讀取數(shù)據(jù)的時候發(fā)現(xiàn),咦,怎么多了條數(shù)據(jù)。 解決辦法:只能嚴格的串行化執(zhí)行。(并發(fā)程度最低,效率也最低,但是數(shù)據(jù)的可靠性最高)
這里很容易搞混不可重復讀和幻讀。其實只需要理解,不可重復讀是修改數(shù)據(jù),數(shù)據(jù)的條數(shù)不變;幻讀是增加或者刪除數(shù)據(jù),數(shù)據(jù)的內(nèi)容不變,條數(shù)發(fā)生改變。
MySQL的隔離級別
讀未提交(read-uncommitted):會有臟讀,不可重復讀,幻讀問題 不可重復讀(read-committed):會有不可重復讀,幻讀問題 可重復讀(repeatable-read):會有幻讀問題 串行化 (serializable):解決這三個問題
事務的隔離級別并不是越高越好,但事務的隔離級別越高,那么并發(fā)性就越低,效率越低,數(shù)據(jù)的可靠性就會越高。
MySQL8開始,用SELECT@@GLOBAL.transaction_isolation,@@transaction_isolation;查詢隔離級別(這里是是MySQL5)

這里我們可以看到MySQL的全局隔離級別和當前會話隔離級別皆是REPEATABLE一READ(可重復讀),不同的數(shù)據(jù)庫有不同的默認隔離級別,而且我們也可以自行修改它。
通過如下命令可以修改隔離級別(建議在修改時修改當前 session 隔離級別即可,不用修改全局的隔離級別):
SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
注意,如果只是修改了當前 session 的隔離級別,則換一個 session 之后,隔離級別又會恢復到默認的隔離級別,所以我們測試時,修改當前 session 的隔離級別即可。

到此這篇關于深入解析MySQL 事務的文章就介紹到這了,更多相關MySQL 事務內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
MySQL數(shù)據(jù)庫子查詢?sub?query
這篇文章主要介紹了MySQL數(shù)據(jù)庫子查詢?sub?query,子查詢指嵌套查詢下層的程序模塊,當一個查詢是另一個查詢的條件的時候,更多相關內(nèi)容需要的小伙伴可以參考一下下面文章內(nèi)容介紹2022-06-06

