什么是mysql的可重复读
今天就跟大家聊聊有關(guān)什么是mysql的可重復(fù)讀,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。
引入問題
這個(gè)問題來源于一個(gè)網(wǎng)絡(luò)課程的課后思考題,題目是這樣的:
我用下面的表結(jié)構(gòu)和初始化語句作為試驗(yàn)環(huán)境,事務(wù)隔離級(jí)別是可重復(fù)讀。現(xiàn)在,我要把所有“字段 c 和 id 值相等的行”的 c 值清零,但是卻發(fā)現(xiàn)了一
個(gè)“詭異”的、改不掉的情況。請(qǐng)你構(gòu)造出這種情況,并說明其原理。
mysql>CREATETABLE`test2`(
`id`int(11)NOTNULL,
`c`int(11)DEFAULTNULL,
PRIMARYKEY(`id`)
)ENGINE=InnoDB;
insertintotest2(id,c)values(1,1),(2,2),(3,3),(4,4);
補(bǔ)充解釋下這個(gè)問題,mysql環(huán)境,innodb引擎,事務(wù)的隔離級(jí)別是可重復(fù)讀,一個(gè)表只有兩個(gè)字段,然后插入4條數(shù)據(jù),希望你構(gòu)造上圖中的一種情況,就是明明update了,但是結(jié)果沒有更新,select也好像沒有生效。
給出問題的答案
先直接給出答案吧,
開啟兩個(gè)mysql的交互窗口,模擬兩個(gè)事物的操作,比如一個(gè)事物叫A,一個(gè)事物叫B。
流程是這樣的,
//事物A
starttransactionwithconsistentsnapshot;
//事物B
updatetest2setc=c+4;
//事物A
updatetest2setc=0whereid=c;
//事物A
select*fromtest2;
具體操作的截圖如下,
A事物 commit 后(事物結(jié)束),才可以通過select看到真實(shí)數(shù)據(jù)。
解釋說明
要理解這個(gè)問題的答案,首先需要搞懂什么是可重復(fù)讀的隔離級(jí)別。
可重復(fù)讀隔離級(jí)別,事務(wù) A 啟動(dòng)的時(shí)候會(huì)創(chuàng)建一個(gè)視圖 read-view,之后事務(wù) A 執(zhí)行期間,即使有其他事務(wù)修改了數(shù)據(jù),事務(wù) A 看到的仍然跟在啟動(dòng)時(shí)看到的一樣。
我們首先在事物 A 執(zhí)行 start transaction with consistent snapshot,這個(gè)就開始了事物A的生命周期,并且是手動(dòng)事物。因?yàn)?start transaction 默認(rèn)就禁用了autocommit。
然后事物 B 開始直接執(zhí)行了update。為了操作簡(jiǎn)單這里用了自動(dòng)事物。也就是事物 B 在update后事物就提交了。
這個(gè)時(shí)候數(shù)據(jù)變成了下面這個(gè)樣子:
| id | c |
|---|---|
| 1 | 5 |
| 2 | 6 |
| 3 | 7 |
| 4 | 8 |
然后事物A繼續(xù)執(zhí)行 update test2 set c = 0 where id = c;,很明顯由于事物B已經(jīng)提交了,事物A的update的使用的是當(dāng)前讀,判斷條件不滿足,所以事物 A 不會(huì)更新任何數(shù)據(jù)。
接著,事物 A 執(zhí)行select語句,為什么結(jié)果還是以前的數(shù)據(jù)呢?是因?yàn)槭挛?A 的select使用的一致讀,也叫快照讀,讀取的還是以前的快照數(shù)據(jù)。
一致性讀是讀取在某個(gè)時(shí)間點(diǎn)已經(jīng)提交了的數(shù)據(jù), 在本示例中,這個(gè)時(shí)間點(diǎn)就是 start transaction with consistent snapshot執(zhí)行的時(shí)間點(diǎn)。
索引,現(xiàn)在互聯(lián)網(wǎng)公司大部分會(huì)把隔離級(jí)別設(shè)置成RC(Read Commited),也就是讀已提交模式。當(dāng)然除了上面那個(gè)問題,還有其它原因,這個(gè)不是本文的重點(diǎn)就不展開來講了。
總結(jié)
以上是生活随笔為你收集整理的什么是mysql的可重复读的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: nodejs TCP server和TC
- 下一篇: 使用JS实现简单计算器的方法