中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

什么是mysql的可重復讀

發布時間:2021-10-25 09:48:41 來源:億速云 閱讀:338 作者:柒染 欄目:大數據

今天就跟大家聊聊有關什么是mysql的可重復讀,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結了以下內容,希望大家根據這篇文章可以有所收獲。

引入問題

這個問題來源于一個網絡課程的課后思考題,題目是這樣的:

我用下面的表結構和初始化語句作為試驗環境,事務隔離級別是可重復讀。現在,我要把所有“字段 c 和 id 值相等的行”的 c 值清零,但是卻發現了一
個“詭異”的、改不掉的情況。請你構造出這種情況,并說明其原理。

mysql> CREATE TABLE `test2` (
  `id` int(11) NOT NULL,
  `c` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB;
insert into test2(id, c) values(1,1),(2,2),(3,3),(4,4);
 

 

什么是mysql的可重復讀

補充解釋下這個問題,mysql環境,innodb引擎,事務的隔離級別是可重復讀,一個表只有兩個字段,然后插入4條數據,希望你構造上圖中的一種情況,就是明明update了,但是結果沒有更新,select也好像沒有生效。

 

給出問題的答案

先直接給出答案吧,

開啟兩個mysql的交互窗口,模擬兩個事物的操作,比如一個事物叫A,一個事物叫B。

流程是這樣的,

//事物A
start transaction with consistent snapshot;
 
//事物B
update test2 set c = c + 4;
 
//事物A 
update test2 set c = 0 where id = c;
 
//事物A
select * from test2;
 

具體操作的截圖如下,

什么是mysql的可重復讀

A事物 commit 后(事物結束),才可以通過select看到真實數據。

 

解釋說明

要理解這個問題的答案,首先需要搞懂什么是可重復讀的隔離級別。

可重復讀隔離級別,事務 A 啟動的時候會創建一個視圖 read-view,之后事務 A 執行期間,即使有其他事務修改了數據,事務 A 看到的仍然跟在啟動時看到的一樣。

我們首先在事物 A 執行 start transaction with consistent snapshot,這個就開始了事物A的生命周期,并且是手動事物。因為 start transaction 默認就禁用了autocommit。

然后事物 B 開始直接執行了update。為了操作簡單這里用了自動事物。也就是事物 B 在update后事物就提交了。

這個時候數據變成了下面這個樣子:

idc
15
26
37
48

然后事物A繼續執行 update test2 set c = 0 where id = c;,很明顯由于事物B已經提交了,事物A的update的使用的是當前讀,判斷條件不滿足,所以事物 A 不會更新任何數據。

接著,事物 A 執行select語句,為什么結果還是以前的數據呢?是因為事物 A 的select使用的一致讀,也叫快照讀,讀取的還是以前的快照數據。

一致性讀是讀取在某個時間點已經提交了的數據, 在本示例中,這個時間點就是 start transaction with consistent snapshot執行的時間點。

索引,現在互聯網公司大部分會把隔離級別設置成RC(Read Commited),也就是讀已提交模式。當然除了上面那個問題,還有其它原因,這個不是本文的重點就不展開來講了。

看完上述內容,你們對什么是mysql的可重復讀有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注億速云行業資訊頻道,感謝大家的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

武威市| 固镇县| 青海省| 福安市| 申扎县| 察雅县| 武山县| 河间市| 手机| 望都县| 临泽县| 合水县| 从江县| 定陶县| 大石桥市| 同心县| 英德市| 阿拉善盟| 怀安县| SHOW| 宁津县| 博湖县| 从化市| 江城| 霸州市| 高淳县| 明光市| 扎兰屯市| 自治县| 准格尔旗| 雷波县| 当雄县| 洛隆县| 马关县| 宾阳县| 旌德县| 宿州市| 南投县| 壤塘县| 文成县| 特克斯县|