Mysql:RC隔离级别下如何提高并发?

RC

  • 最近在Mysql RC隔离级别下遇到个问题:源表并发upsert目标表报错:Deadlock found when try to get lock

一、索引

  • Mysql是支持行锁的,但是行锁只是针对索引列,若删除条件未加索引会导致走表锁,这样就会造成死锁

二、唯一索引

索引建了之后运行还是报错死锁,打开死锁日志

sql 复制代码
show engine innodb status

报错:

sql 复制代码
lock_mode X locks gap before rec insert intention waiting

意思是插入意向锁准备插入之前遇到了间隙锁,但是隔离级别是RC,按照网上的说法和文档,RC隔离级别是不会出现Gap Lock的,后面发现表中若有唯一索引,RC隔离级别下并发也会导致Gap Lock,去掉唯一索引,跑批就没问题了

结论:

  • 在delete + insert,insert...on duplicate key update,replace into等场景中,为了实现判断插入记录和现有物理记录是否冲突和插入记录这两个阶段的原子,unique check的时候会给所有的相同的record和下一个record加上next-key lock.导致后续insert record虽然没有冲突,但还是会被Block住,进而有可能造成死锁的问题

参考文章:RC隔离级别出现Gap Lock

相关推荐
Nturmoils13 小时前
订单列表慢查询,先看 WHERE、ORDER BY 和 LIMIT
数据库
渣波17 小时前
拒绝 SQL 焦虑!手把手带你用 NestJS + Prisma + DTO 写出“防弹”级后端代码
javascript·数据库·后端
Jim6001 天前
【吃透 MySQL InnoDB连载】第 1 章・解密线上数据库高频故障
mysql
GreatSQL2 天前
gt-checksum v4.0.0 新功能解读系列文章(4):SSL 加密连接——数据校验传输安全再升级
mysql
倔强的石头_2 天前
KingbaseES 新版MySQL 兼容版体验:旧版迁移 + 功能实测
数据库
倔强的石头_5 天前
《Kingbase护城河》——数据库存储空间全景探测与精细化瘦身实战
数据库
云技纵横5 天前
唯一索引 INSERT 死锁实战:5 秒复现交叉插入的 S 锁循环等待
sql·mysql
沉默王二5 天前
面试官:RAG 不用向量数据库,用 MySQL 硬扛?我:100 万向量不是很轻松?
mysql·面试·ai编程
冬奇Lab5 天前
每日一个开源项目(第134篇):Zvec - 阿里开源的嵌入式向量数据库,向量搜索界的 SQLite
数据库·人工智能·llm