40 | insert語句的鎖為什么這么多?(insert為什么加讀鎖击碗?)

盡量申請自增 id 后筑悴,釋放自增鎖(上一篇)。

insert 輕量對普通才有效稍途。有些 insert :其他資源加鎖阁吝,申請自增 id 后,不能馬上釋放械拍。

一突勇、insert … select 語句

t 和 t2 的表結(jié)構(gòu)装盯、初始化數(shù)據(jù)

可重復(fù)讀隔離級別binlog_format=statementinsert into? t2(c,d) select c,d from t;

所有行和間隙加鎖,保證日志和數(shù)據(jù)一致性甲馋。執(zhí)行序列:

圖 1 并發(fā) insert 場景

B先執(zhí)行埂奈, t 主鍵索引加了 (-∞,1] 這個 next-key lock,執(zhí)行完A 的 insert 執(zhí)行定躏。

沒有鎖账磺,B 的 insert先執(zhí)行,后寫入 binlog痊远。binlog_format=statement 垮抗,binlog 里面就記錄了這樣的語句序列:

insert into t? values(-1,-1,-1);

insert into? t2(c,d) select c,d from t;

到了備庫執(zhí)行,把 id=-1 寫到表 t2 中碧聪,主備不一致冒版。

二、insert 循環(huán)寫入

insert …select 只鎖需訪問資源逞姿,不是鎖全表辞嗡。

2.1?insert into?t2?掃描行數(shù)Rows_examined=1,受 limit 1 影響

insert into? t2(c,d)? (select c+1, d from t force? index(c) order by c desc limit 1);? ?//插入一行數(shù)據(jù)哼凯, c 值= c 最大值+ 1欲间。

加鎖范圍:?索引 c 上 (3,4] (4,supremum]這兩個 next-key lock,主鍵索引 id=4 這行断部。

索引 c 倒序猎贴,掃描第一行,結(jié)果寫入 t2 蝴光。

圖 2 慢查詢?nèi)罩?-- 將數(shù)據(jù)插入表 t2

2.2 插入表 tRows_examined = 5? 她渴,用臨時表

insert into? t(c,d)? (select c+1, d from t force? index(c) order by c desc limit 1);?

圖 3 慢查詢?nèi)罩?-- 將數(shù)據(jù)插入表 t??
圖 4 explain 結(jié)果( ?explain “腦補”執(zhí)行過程。 )

Using temporary用臨時表:t 內(nèi)容讀出蔑祟,寫入臨時表趁耗。

rows =1,猜測:子查詢結(jié)果讀出來(掃描 1 行)疆虚,寫入臨時表苛败,從臨時表讀出來(掃描 1 行),寫回表 t 中径簿。掃描行數(shù) 2(不是5)罢屈,猜測不對

圖 5 查看 Innodb_rows_read 變化

2.3 用臨時表原因

邊遍歷邊更新篇亭,讀出直接寫回原表缠捌,遍歷過程,讀到剛插記錄(如果參與計算邏輯译蒂,跟語義不符)曼月。

Innodb_rows_read增加 4谊却。 Memory 全表掃描表 t

1. 創(chuàng)建臨時表哑芹,字段 c 和 d

2.? 索引 c 掃描表 t炎辨,依次取 c=4、3绩衷、2蹦魔、1回表,讀到 c 和 d 寫入臨時表咳燕。Rows_examined=4勿决。

3.? ?limit 1,只取臨時表第一行招盲,插入 t 低缩。Rows_examined加 1,= 5曹货。

索引 c 上間隙都加上共享 next-key lock咆繁。其他事務(wù)不能insert

2.4 優(yōu)化辦法

1:沒在子查詢中直接使用 limit 1顶籽,遍歷整表 玩般。應(yīng)先 insert into臨時表 temp_t,只需要掃描一行礼饱;取出插入t1坏为。

2:數(shù)據(jù)量用內(nèi)存臨時表

三镊绪、insert 唯一鍵沖突

圖 6 唯一鍵沖突加鎖

可重復(fù)讀(repeatable read)匀伏。 B insert 鎖等待。

A 唯一鍵沖突蝴韭,沖突索引上加鎖够颠。 next-key lock 由右邊界值定義。 A 持有索引 c 上 (5,10] 共享 next-key lock(讀鎖)榄鉴。

主鍵履磨、唯一索引沖突加都 next-key lock。加讀鎖庆尘,避免這行被別的事務(wù)刪掉蹬耘。

3.1 經(jīng)典死鎖場景

圖 7 唯一鍵沖突 -- 死鎖??

session A rollback 時,C 幾乎同時發(fā)現(xiàn)死鎖并返回减余。

1.? T1 ,啟動? A惩系,insert 語句位岔,索引c=5記錄鎖如筛。c是唯一索引,退化為記錄鎖(如果你的印象模糊了抒抬,可以回顧下第 21 篇文章介紹的加鎖規(guī)則)杨刨。

2.? T2 , B 相同 insert 語句擦剑,唯一鍵沖突妖胀,加讀鎖?惠勒; C 也在索引c 上赚抡,c=5 記錄上加讀鎖

3.? T3 時刻纠屋,A 回滾涂臣。 B 和 C 執(zhí)行插入操作,加寫鎖售担。等待對方行鎖赁遗,死鎖

圖 8 狀態(tài)變化圖 -- 死鎖??

四族铆、insert into … on duplicate?key update

主鍵沖突后直接報錯岩四,如改寫成

insert into t? values(11,10,10)?on?duplicate key update?d=100;? 給索引 c 上 (5,10]?加排他 next-key lock(寫鎖)

插入碰到唯一鍵約束哥攘,執(zhí)行后面更新語句剖煌。

多個列違反了唯一性約束,按照索引的順序献丑,修改跟第一個索引沖突的行末捣。

已有 (1,1,1) 和 (2,2,2)

圖 9 兩個唯一鍵同時沖突

先判斷主鍵 id 是的,跟 id=2 這一行沖突创橄,修改 id=2 行箩做。

需要注意的是,執(zhí)行這條語句affected rows 返回的是 2妥畏,很容易造成誤解邦邦。真正更新的只有一行,insert 和 update 都認為自己成功了醉蚁,計數(shù)都加1

小結(jié)

insert … select 拷貝數(shù)據(jù)燃辖。可重復(fù)讀, select 掃描記錄的間隙加讀鎖网棍。

insert 和 select 對象是同一個表黔龟,循環(huán)寫入。引入用戶臨時表優(yōu)化

insert 唯一鍵沖突氏身,沖突唯一值上加共享 next-key lock(S 鎖)巍棱。盡快提交或回滾事務(wù),避免加鎖時間長蛋欣。

問題

兩個表之間拷貝數(shù)據(jù)什么方法航徙,注意事項?優(yōu)勢陷虎?

下一篇文章到踏。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市尚猿,隨后出現(xiàn)的幾起案子窝稿,更是在濱河造成了極大的恐慌,老刑警劉巖谊路,帶你破解...
    沈念sama閱讀 218,204評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件讹躯,死亡現(xiàn)場離奇詭異,居然都是意外死亡缠劝,警方通過查閱死者的電腦和手機潮梯,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來惨恭,“玉大人秉馏,你說我怎么就攤上這事⊥严郏” “怎么了萝究?”我有些...
    開封第一講書人閱讀 164,548評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長锉罐。 經(jīng)常有香客問我帆竹,道長,這世上最難降的妖魔是什么脓规? 我笑而不...
    開封第一講書人閱讀 58,657評論 1 293
  • 正文 為了忘掉前任栽连,我火速辦了婚禮,結(jié)果婚禮上侨舆,老公的妹妹穿的比我還像新娘秒紧。我一直安慰自己,他們只是感情好挨下,可當我...
    茶點故事閱讀 67,689評論 6 392
  • 文/花漫 我一把揭開白布熔恢。 她就那樣靜靜地躺著,像睡著了一般臭笆。 火紅的嫁衣襯著肌膚如雪叙淌。 梳的紋絲不亂的頭發(fā)上秤掌,一...
    開封第一講書人閱讀 51,554評論 1 305
  • 那天,我揣著相機與錄音鹰霍,去河邊找鬼机杜。 笑死,一個胖子當著我的面吹牛衅谷,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播似将,決...
    沈念sama閱讀 40,302評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼获黔,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了在验?” 一聲冷哼從身側(cè)響起玷氏,我...
    開封第一講書人閱讀 39,216評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎腋舌,沒想到半個月后盏触,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,661評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡块饺,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,851評論 3 336
  • 正文 我和宋清朗相戀三年赞辩,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片授艰。...
    茶點故事閱讀 39,977評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡辨嗽,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出淮腾,到底是詐尸還是另有隱情糟需,我是刑警寧澤,帶...
    沈念sama閱讀 35,697評論 5 347
  • 正文 年R本政府宣布谷朝,位于F島的核電站洲押,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏圆凰。R本人自食惡果不足惜杈帐,卻給世界環(huán)境...
    茶點故事閱讀 41,306評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望送朱。 院中可真熱鬧娘荡,春花似錦、人聲如沸驶沼。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽回怜。三九已至大年,卻和暖如春换薄,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背翔试。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評論 1 270
  • 我被黑心中介騙來泰國打工轻要, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人垦缅。 一個月前我還...
    沈念sama閱讀 48,138評論 3 370
  • 正文 我出身青樓冲泥,卻偏偏與公主長得像,于是被迫代替她去往敵國和親壁涎。 傳聞我的和親對象是個殘疾皇子凡恍,可洞房花燭夜當晚...
    茶點故事閱讀 44,927評論 2 355

推薦閱讀更多精彩內(nèi)容