mysql間隙鎖原理 間隙鎖用法?
間隙鎖用法?間隙鎖的作用保證某個間隙內的數(shù)據(jù)在鎖定情況下不會發(fā)生任何變化。比如mysql默認隔離級別下的可重復讀(RR)。當使用唯一索引來搜索唯一行的語句時,不需要間隙鎖定。如下面語句的id列有唯一索
間隙鎖用法?
間隙鎖的作用
保證某個間隙內的數(shù)據(jù)在鎖定情況下不會發(fā)生任何變化。比如mysql默認隔離級別下的可重復讀(RR)。
當使用唯一索引來搜索唯一行的語句時,不需要間隙鎖定。如下面語句的id列有唯一索引,此時只會對id值為10的行使用記錄鎖。
select * from t where id = 10 for update// 注意:普通查詢是快照讀,不需要加鎖
如果,上面語句中id列沒有建立索引或者是非唯一索引時,則語句會產生間隙鎖。
mysql有了間隙鎖只有能夠解決幻讀問題嗎?
不可重復讀:在一個未提交的事務里,二次查詢結果可能不相同,因為在這個事務執(zhí)行過程中,外面的 事務可能對這個數(shù)據(jù)集進行了修改并提交!
幻讀:一個事務在操作過程中!有別的事務對此數(shù)據(jù)集進行了修改并提交,但這些操作第一個事務讀不到,等到這個事務提交的時候,便有可能引起明明插入的數(shù)據(jù)沒有查詢到,但卻出現(xiàn)插入重復的錯誤!
不可重復讀與幻讀的區(qū)別:
不可重復讀是能讀到其它事務已經提交的數(shù)據(jù),幻讀是讀不到其它事務已提交的數(shù)據(jù)!
間隙鎖:間隙鎖主要用來防止幻讀,用在repeatable-read隔離級別下,指的是當對數(shù)據(jù)進行條件,范圍檢索時,對其范圍內也許并存在的值進行加鎖!