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

相关推荐
TDengine (老段)5 分钟前
TDengine 数学函数 LOG 用户手册
java·大数据·数据库·时序数据库·iot·tdengine·涛思数据
TDengine (老段)12 分钟前
TDengine 数据函数 MOD 用户手册
大数据·数据库·物联网·时序数据库·tdengine·涛思数据
文档搬运工12 分钟前
Oracle 19.29
数据库·oracle
小小管写大大码25 分钟前
AI重排序API:优化搜索相关性
数据库·人工智能
努力学习的少女2 小时前
SpaekSql函数
前端·数据库
张毫洁2 小时前
mysql、oracle的JDBC操作
数据库·mysql·oracle
-Xie-2 小时前
Mysql杂志(三十四)——MVCC、日志分类
数据库·mysql
Tech有道3 小时前
字节真实面经:以Mysql为例,讲一下一条SQL的执行过程和原理!
数据库·后端
壹米饭3 小时前
QuestDB数据不能新增问题解决方案
数据库·后端
一个喜欢分享的PHP技术3 小时前
使用JdbcTemplate访问MySQL数据库
数据库