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)聲明
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載。
THE END