RC
- 一、索引
- 二、唯一索引
- 最近在Mysql RC隔离级别下遇到个问题:源表并发upsert目标表报错:Deadlock found when try to get lock
一、索引
- Mysql是支持行锁的,但是行锁只是针对索引列,若删除条件未加索引会导致走表锁,这样就会造成死锁
二、唯一索引
索引建了之后运行还是报错死锁,打开死锁日志
show engine innodb status
报错:
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