40 | insert语句的锁为什么这么多?(insert为什么加读锁?)

尽量申请自增 id 后,释放自增锁(上一篇)。

insert 轻量对普通才有效。有些 insert :其他资源加锁,申请自增 id 后,不能马上释放。

一、insert … select 语句

t 和 t2 的表结构、初始化数据

可重复读隔离级别binlog_format=statementinsert into? t2(c,d) select c,d from t;

所有行和间隙加锁,保证日志和数据一致性。执行序列:

图 1 并发 insert 场景

B先执行, t 主键索引加了 (-∞,1] 这个 next-key lock,执行完A 的 insert 执行。

没有锁,B 的 insert先执行,后写入 binlog。binlog_format=statement ,binlog 里面就记录了这样的语句序列:

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

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

到了备库执行,把 id=-1 写到表 t2 中,主备不一致。

二、insert 循环写入

insert …select 只锁需访问资源,不是锁全表。

2.1?insert into?t2?扫描行数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);? ?//插入一行数据, c 值= c 最大值+ 1。

加锁范围:?索引 c 上 (3,4] (4,supremum]这两个 next-key lock,主键索引 id=4 这行。

索引 c 倒序,扫描第一行,结果写入 t2 。

图 2 慢查询日志 -- 将数据插入表 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 慢查询日志 -- 将数据插入表 t??
图 4 explain 结果( ?explain “脑补”执行过程。 )

Using temporary用临时表:t 内容读出,写入临时表。

rows =1,猜测:子查询结果读出来(扫描 1 行),写入临时表,从临时表读出来(扫描 1 行),写回表 t 中。扫描行数 2(不是5),猜测不对。

图 5 查看 Innodb_rows_read 变化

2.3 用临时表原因

边遍历边更新,读出直接写回原表,遍历过程,读到刚插记录(如果参与计算逻辑,跟语义不符)。

Innodb_rows_read增加 4。 Memory 全表扫描表 t

1. 创建临时表,字段 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。其他事务不能insert。

2.4 优化办法

1:没在子查询中直接使用 limit 1,遍历整表 。应先 insert into临时表 temp_t,只需要扫描一行;取出插入t1。

2:数据量,用内存临时表

三、insert 唯一键冲突

图 6 唯一键冲突加锁

可重复读(repeatable read)。 B insert 锁等待。

A 唯一键冲突,冲突索引上加锁。 next-key lock 由右边界值定义。 A 持有索引 c 上 (5,10] 共享 next-key lock(读锁)。

主键、唯一索引冲突加都 next-key lock。加读锁,避免这行被别的事务删掉。

3.1 经典死锁场景

图 7 唯一键冲突 -- 死锁??

session A rollback 时,C 几乎同时发现死锁并返回。

1.? T1 ,启动? A,insert 语句,索引c=5记录锁。c是唯一索引,退化为记录锁(如果你的印象模糊了,可以回顾下第 21 篇文章介绍的加锁规则)。

2.? T2 , B 相同 insert 语句,唯一键冲突,加读锁?; C 也在索引c 上,c=5 记录上加读锁。

3.? T3 时刻,A 回滚。 B 和 C 执行插入操作,加写锁。等待对方行锁,死锁。

图 8 状态变化图 -- 死锁??

四、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(写锁)。

插入碰到唯一键约束,执行后面更新语句。

多个列违反了唯一性约束,按照索引的顺序,修改跟第一个索引冲突的行。

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

图 9 两个唯一键同时冲突

先判断主键 id 是的,跟 id=2 这一行冲突,修改 id=2 行。

需要注意的是,执行这条语句affected rows 返回的是 2,很容易造成误解。真正更新的只有一行,insert 和 update 都认为自己成功了,计数都加1

小结

insert … select 拷贝数据。可重复读, select 扫描记录的间隙加读锁

insert 和 select 对象是同一个表,循环写入。引入用户临时表优化

insert 唯一键冲突,冲突唯一值上加共享 next-key lock(S 锁)。尽快提交或回滚事务,避免加锁时间长。

问题

两个表之间拷贝数据什么方法,注意事项?优势?

下一篇文章。

?著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,172评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,346评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事?!?“怎么了?”我有些...
    开封第一讲书人阅读 159,788评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,299评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,409评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,467评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,476评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,262评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,699评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,994评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,167评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,827评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,499评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,149评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,387评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,028评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,055评论 2 352

推荐阅读更多精彩内容