這篇文章主要講解了“怎么理解Innodb一致性非鎖定讀”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來(lái)研究和學(xué)習(xí)“怎么理解Innodb一致性非鎖定讀”吧!
創(chuàng)新互聯(lián)專注于中大型企業(yè)的成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站建設(shè)和網(wǎng)站改版、網(wǎng)站營(yíng)銷服務(wù),追求商業(yè)策劃與數(shù)據(jù)分析、創(chuàng)意藝術(shù)與技術(shù)開發(fā)的融合,累計(jì)客戶數(shù)千家,服務(wù)滿意度達(dá)97%。幫助廣大客戶順利對(duì)接上互聯(lián)網(wǎng)浪潮,準(zhǔn)確優(yōu)選出符合自己需要的互聯(lián)網(wǎng)運(yùn)用,我們將一直專注成都品牌網(wǎng)站建設(shè)和互聯(lián)網(wǎng)程序開發(fā),在前進(jìn)的路上,與客戶一起成長(zhǎng)!
一致性非鎖定讀指InnoDB通過(guò)多版本控制(MVCC)的方式在某個(gè)時(shí)間點(diǎn)通過(guò)查詢數(shù)據(jù)庫(kù)快照數(shù)據(jù)來(lái)讀取數(shù)據(jù)。
在RR事務(wù)隔離級(jí)別下,在一個(gè)事務(wù)中第一次(select讀)數(shù)據(jù)的時(shí)候創(chuàng)建快照,快照是在第一次select之前所有提交的數(shù)據(jù)的最新版本的數(shù)據(jù),在此事務(wù)結(jié)束之前,select到的數(shù)據(jù)是一致的(快照)。
注意:Begin和start transaction開啟事務(wù)的時(shí)候快照并沒(méi)有創(chuàng)建,而是第一次select讀數(shù)據(jù)時(shí)候創(chuàng)建。
如下:
Session A | Session B |
Session A>drop table t; | |
上面的for update進(jìn)行的鎖定讀,此時(shí)并沒(méi)有創(chuàng)建read view注意:for update和lock in share mode都是鎖定讀,此時(shí)并不會(huì)創(chuàng)建快照 | Session B>begin; |
Session A>select * from t; #此時(shí)才創(chuàng)建read view生成快照 | 你可能會(huì)發(fā)現(xiàn)RR隔離級(jí)別,不是應(yīng)該看不到其他事務(wù)修改的數(shù)據(jù)嗎?這正是因?yàn)閎egin開啟一個(gè)事務(wù),不是begin的時(shí)候創(chuàng)建read view,而是第一次進(jìn)行快照讀的時(shí)候才創(chuàng)建 |
在innodb的READ COMMITTED和REPEATABLE READ隔離級(jí)別下執(zhí)行select操作,默認(rèn)模式就是一致性讀。
一致性讀不會(huì)對(duì)訪問(wèn)的表加任何鎖,因此,其他會(huì)話可以任意的修改對(duì)象數(shù)據(jù)而不會(huì)影響當(dāng)前會(huì)話的一致性讀。
在RR隔離級(jí)別下,某個(gè)時(shí)間點(diǎn)開啟一個(gè)事務(wù)T1查詢表的數(shù)據(jù),接著開啟另外一個(gè)新的事務(wù)T2對(duì)其delete、update、insert數(shù)據(jù)并且commit成功后,在T1中無(wú)法看到T2修改并且提交的結(jié)果。
注意:快照讀主要適用于在一個(gè)事務(wù)中的select語(yǔ)句。所以事務(wù)中的DML語(yǔ)句是可以看到其他session中的事務(wù)的更新的,即時(shí)SELECT并不能看到這些
例如,同時(shí)開啟事務(wù)T1、T2、T3,在T1中刪除或者修改表t的數(shù)據(jù),在T2中select查詢的結(jié)果(快照讀)是之前的t的數(shù)據(jù)(T2事務(wù)開啟時(shí)間點(diǎn)的前t的數(shù)據(jù)),但T3對(duì)表t修改或者刪除可能會(huì)影響剛才T1提交的行。
下面的例子中:Session A只有在Session B的insert操作commit完成,并且Session A自身事務(wù)commit之后才能看到Session B插入的數(shù)據(jù)
可以使用READ COMMITTED或locking read(SELECT * FROM t LOCK IN SHARE MODE;)來(lái)查看表最新的數(shù)據(jù)。
一致性讀不適用于特定的DDL語(yǔ)句如DROP TABLE、ALTER TABLE。
另外,對(duì)于 INSERT INTO ... SELECT, UPDATE ... (SELECT)和CREATE TABLE ... SELECT操作,雖然后面的select未指定FOR UPDATE或LOCK IN SHARE MODE,但此時(shí)的select和READ COMMIT隔離級(jí)別下的SELECT一樣,讀取最新版本數(shù)據(jù)(使用的當(dāng)前讀)。
如下:
Session A | Session B |
ession A>create table a (x int primary key,y int); | |
#在A提交之前,B開啟事務(wù) Session B>begin; | |
#session A提交上面的事務(wù) Session A>commit; | |
#在B中select查詢,依舊進(jìn)行的是快照讀,故看不到數(shù)據(jù) Seesion B>select * from a; | |
#使用lock in share mode或for update進(jìn)行當(dāng)前讀能看到表a的數(shù)據(jù) |
當(dāng)innodb_locks_unsafe_for_binlog選項(xiàng)為1時(shí)(關(guān)閉GAP鎖),在READ UNCOMMITTED, READ COMMITTED, REPEATABLEREAD隔離級(jí)別下,select查詢表的數(shù)據(jù),不會(huì)對(duì)數(shù)據(jù)進(jìn)行鎖定,而都是一致性讀。
感謝各位的閱讀,以上就是“怎么理解Innodb一致性非鎖定讀”的內(nèi)容了,經(jīng)過(guò)本文的學(xué)習(xí)后,相信大家對(duì)怎么理解Innodb一致性非鎖定讀這一問(wèn)題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!