真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

怎么理解Innodb一致性非鎖定讀

這篇文章主要講解了“怎么理解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;
Session A>create table t(x int primary key);
Session A>insert into t values (1),(5);
Session A>begin;
Session A>select @@tx_isolation;
+-----------------+
| @@tx_isolation  |
+-----------------+
| REPEATABLE-READ |
+-----------------+
Session A>select * from t where x=5 for update;

上面的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 B>select @@tx_isolation;
+-----------------+
| @@tx_isolation  |
+-----------------+
| REPEATABLE-READ |
+-----------------+
1 row in set (0.00 sec)
Session B>insert into t select 3;
Session B>commit;

Session A>select * from t;  #此時(shí)才創(chuàng)建read view生成快照
+---+
| x |
+---+
| 1 |
| 3 |
| 5 |
+---+

你可能會(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ù)

怎么理解Innodb一致性非鎖定讀

可以使用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);
Query OK, 0 rows affected (0.17 sec)
#開啟一個(gè)新事務(wù)
Session A>begin;
Query OK, 0 rows affected (0.00 sec)

Session A>select * from a;
Empty set (0.00 sec)
#插入數(shù)據(jù)
Session A>insert into a select 1,2;
Query OK, 1 row affected (0.00 sec)
Records: 1  Duplicates: 0  Warnings: 0
#當(dāng)前事務(wù)能看到insert的數(shù)據(jù)
Session A>select * from a;
+---+------+
| x | y    |
+---+------+
| 1 |    2 |
+---+------+
1 row in set (0.00 sec)#暫時(shí)不commit

#在A提交之前,B開啟事務(wù)                                     Session B>begin;
Query OK, 0 rows affected (0.00 sec)
#此時(shí)查詢表a的數(shù)據(jù),一致性非鎖定讀,讀到的是事務(wù)開啟前已經(jīng)提交的數(shù)據(jù),因?yàn)锽的事務(wù)開始的時(shí)候A事務(wù)還沒(méi)有提交,故A中insert的數(shù)據(jù)不會(huì)顯示
Session B>select * from a;
Empty set (0.00 sec)

#session A提交上面的事務(wù)                          Session A>commit;
Query OK, 0 rows affected (0.00 sec)

#在B中select查詢,依舊進(jìn)行的是快照讀,故看不到數(shù)據(jù)                          Seesion B>select * from a;
Empty set (0.00 sec)

Seesion B>select * from aa;
Empty set (0.00 sec)
#INSERT INTO ... SELECT * FROM A;操作
Seesion B>insert into aa select * from a;
Query OK, 1 row affected (0.00 sec)
Records: 1  Duplicates: 0  Warnings: 0

Seesion B>select * from a;
Empty set (0.00 sec)
#發(fā)現(xiàn)直接select表a還是查不到數(shù)據(jù),而aa表能看到數(shù)據(jù)
Seesion B>select * from aa;
+---+------+
| x | y    |
+---+------+
| 1 |    2 |
+---+------+
1 row in set (0.00 sec)

#使用lock in share mode或for update進(jìn)行當(dāng)前讀能看到表a的數(shù)據(jù)
Seesion B>select * from a lock in share mode;
+---+------+
| x | y    |
+---+------+
| 1 |    2 |
+---+------+
1 row in set (0.00 sec)

Seesion B>select * from a;
Empty set (0.00 sec)
Seesion B>select * from a for update;
+---+------+
| x | y    |
+---+------+
| 1 |    2 |
+---+------+
1 row in set (0.00 sec)

當(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)注!


本文標(biāo)題:怎么理解Innodb一致性非鎖定讀
網(wǎng)站網(wǎng)址:http://weahome.cn/article/jphjoo.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部