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