MySQL 幻讀怎么解決?

MySQL 幻讀怎么解決?

mysql 幻讀怎么解決?

1、MVCC快照,將歷史數(shù)據(jù)存一份快照,在其事務(wù)增加與刪除數(shù)據(jù)時(shí),保證當(dāng)前事務(wù)來(lái)說(shuō)是不可見(jiàn)的;

多數(shù)數(shù)據(jù)庫(kù)都實(shí)現(xiàn)了多版本并發(fā)控制,并且都是靠保存數(shù)據(jù)快照來(lái)實(shí)現(xiàn)的。

以 InnoDB 為例,每一行中都冗余了兩個(gè)字?jǐn)唷R粋€(gè)是行的創(chuàng)建版本,一個(gè)是行的刪除(過(guò)期)版本。版本號(hào)隨著每次事務(wù)的開(kāi)啟自增。事務(wù)每次取數(shù)據(jù)的時(shí)候都會(huì)取創(chuàng)建版本小于當(dāng)前事務(wù)版本的數(shù)據(jù),以及過(guò)期版本大于當(dāng)前版本的數(shù)據(jù)。

普通的 select 就是快照讀。

select?*?from?T?where?number?=?1;

2、“next-key”鎖,將當(dāng)前數(shù)據(jù)行與上一條數(shù)據(jù)和下一條數(shù)據(jù)之間的間隙鎖定,保證此范圍內(nèi)讀取的數(shù)據(jù)是一致的。

next-key 鎖包含兩部分

  • 記錄鎖(行鎖)

  • 間隙鎖

記錄鎖是加在索引上的鎖,間隙鎖是加在索引之間的。(思考:如果列上沒(méi)有索引會(huì)發(fā)生什么?)

select?*?from?T?where?number?=?1?for?update; select?*?from?T?where?number?=?1?lock?in?share?mode; insert update delete

推薦教程:《MySQL教程

? 版權(quán)聲明
THE END
喜歡就支持一下吧
點(diǎn)贊11 分享
站長(zhǎng)的頭像-小浪學(xué)習(xí)網(wǎng)月度會(huì)員