MySQL可重復(fù)讀隔離級(jí)別下開啟事務(wù)的問題解決
1.前言
在日常我們操作mysql時(shí),mysql默認(rèn)是自動(dòng)提交的。當(dāng)我們需要開啟一個(gè)事務(wù)時(shí),可以使用start transaction
或begin
命令,再使用commit
或rollback
提交或回滾事務(wù)。
但事務(wù)的使用也有一些注意事項(xiàng),不注意的話,可能會(huì)帶來意料之外的結(jié)果。
今天,我要分享的就是在Repeatable Read
(簡稱rr)隔離級(jí)別下,mysql的快照生成時(shí)機(jī)的問題。
2.問題引出
我們都知道,rr級(jí)別下,是根據(jù)快照來讀取數(shù)據(jù)的,所以他能保證同一事務(wù)內(nèi)的兩次讀取是一致的,不會(huì)因?yàn)槠渌聞?wù)提交的修改而導(dǎo)致前后讀取結(jié)果不一樣。
現(xiàn)在db3庫下有個(gè)test表,且mysql隔離級(jí)別為rr(默認(rèn)rr)。
開啟兩個(gè)會(huì)話,一個(gè)會(huì)話開啟一個(gè)事務(wù),另一個(gè)會(huì)話開啟一個(gè)事務(wù)并修改一行數(shù)據(jù)
按正常理解來說,此時(shí)在第一個(gè)會(huì)話里查詢數(shù)據(jù),查詢到的還是原來的’zhuzi1’而不是’zhuzin’
但實(shí)際上,我們卻發(fā)現(xiàn),第二個(gè)事務(wù)的修改影響到了第一個(gè)事務(wù)的結(jié)果。
3.原因
上面問題出現(xiàn)的原因,就是因?yàn)槲覀冊(cè)陂_啟一個(gè)事務(wù)時(shí),并沒有立即生成數(shù)據(jù)快照,而是在執(zhí)行一次快照讀(所謂快照讀,就是我們平常使用的普通查詢;當(dāng)前讀則是使用例如for update
加鎖的查詢)之后才生成的。所以,當(dāng)我們?cè)诘谝粋€(gè)事務(wù)中第一次執(zhí)行快照讀時(shí),第二個(gè)事務(wù)已經(jīng)提交修改了,當(dāng)然是可以看到這個(gè)修改的。
mysql想要在開啟事務(wù)時(shí)就生成快照,確保數(shù)據(jù)不再變化,可以使用如下方式開啟事務(wù)
start transaction with consistent snapshot;
這樣,mysql就會(huì)在開啟事務(wù)時(shí)立即生成快照了。
官網(wǎng)對(duì)于with consistent snapshot
的介紹如下:
翻譯的大致意思就是WITH CONSISTENT SNAPSHOT
修飾符為innodb啟動(dòng)一致讀取。且只適用于innodb引擎。其效果與從任何InnoDB表中發(fā)出START TRANSACTION后接SELECT相同。WITH CONSISTENT SNAPSHOT修飾符不會(huì)更改當(dāng)前事務(wù)隔離級(jí)別,因此只有當(dāng)前隔離級(jí)別允許一致讀取時(shí),它才能提供一致的快照。唯一允許一致讀取的隔離級(jí)別是可重復(fù)讀取。對(duì)于所有其他隔離級(jí)別,WITH CONSISTENT SNAPSHOT子句將被忽略。忽略WITH CONSISTENT SNAPSHOT子句時(shí)會(huì)生成警告。
官網(wǎng)對(duì)rr的介紹如下:
由此可知,如果你開啟了一個(gè)事務(wù),卻不進(jìn)行一次讀取操作,那么快照是不會(huì)建立的
到此這篇關(guān)于MySQL可重復(fù)讀隔離級(jí)別下開啟事務(wù)的一個(gè)注意事項(xiàng)的文章就介紹到這了,更多相關(guān)MySQL可重復(fù)讀隔離開啟事務(wù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
MySQL中LIKE子句相關(guān)使用的學(xué)習(xí)教程
這篇文章主要介紹了MySQL中LIKE子句相關(guān)使用的學(xué)習(xí)教程,LIKE子句一般用于WHERE語句中,需要的朋友可以參考下2015-12-12一次MySQL啟動(dòng)導(dǎo)致的事故實(shí)戰(zhàn)記錄
這篇文章主要給大家介紹了一次MySQL啟動(dòng)導(dǎo)致的事故實(shí)戰(zhàn)記錄,記錄了MySQL 啟動(dòng)成功但未監(jiān)聽端口的解決方法,文中給出了詳細(xì)的解決方法,需要的朋友可以參考下2021-09-09CentOS7下mysql 8.0.16 安裝配置方法圖文教程
這篇文章主要為大家詳細(xì)介紹了CentOS7下mysql 8.0.16 安裝配置方法圖文教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-05-05MySQL連接異常報(bào)10061錯(cuò)誤問題解決
這篇文章主要介紹了MySQL連接異常報(bào)10061錯(cuò)誤問題解決,本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-08-08MySQL 5.7.29 + Win64 解壓版 安裝教程圖文詳解
這篇文章主要介紹了MySQL 5.7.29 + Win64 解壓版 安裝教程,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-05-05MySQL超詳細(xì)安裝配置超詳細(xì)圖文教程(親測(cè)有效)
這篇文章詳細(xì)介紹了如何下載、配置和安裝MySQL,包括設(shè)置環(huán)境變量、初始化my.ini文件、開啟MySQL服務(wù)以及設(shè)置密碼,此外,還介紹了如何使用Navicat工具連接MySQL數(shù)據(jù)庫,感興趣的朋友跟隨小編一起看看吧2024-11-11