MySQL基础学习: 由delete和insert操作导致的死锁问题

一、问题复现:表结构

复制代码
CREATE TABLE `user_props` (
  `user_id` bigint NOT NULL ,
  `prop_key` varchar(100) NOT NULL ,
  `prop_value` varchar(100) NOT NULL,
  PRIMARY KEY (`user_id`,`prop_key`)
)

二、死锁测试

(1)开启两个事务

(2)两个事务分别删除两个个不存在的记录

(3)两个事务分别插入该记录

开启事务1

开始事务2

现象描述:

(1)两个事务分别执行delete操作

(2)事务1执行insert操作,阻塞

(3)事务2执行insert操作,产生死锁报错

(4)事务1insert操作成功

三、产生死锁的原因

当删除的记录在数据库中存在,那么产生的就是普通的行锁。当删除的这条记录不存在,会在删除记录所在的区间加间隙锁。

四、解决方案

在删除记录前,先校验下该记录是否存在,如果存在在执行删除操作。

相关推荐
TDengine (老段)3 分钟前
TDengine 地理函数 ST_GeomFromText 用户手册
大数据·数据库·物联网·时序数据库·tdengine·涛思数据
一 乐8 分钟前
海鲜商城购物|基于SprinBoot+vue的海鲜商城系统(源码+数据库+文档)
前端·javascript·数据库·vue.js·spring boot
西岭千秋雪_27 分钟前
MySQL日志梳理(服务器层)
java·运维·服务器·数据库·mysql
boy快快长大30 分钟前
【Spring Cloud Alibaba】Gateway(一)
数据库·gateway
Apache IoTDB44 分钟前
祝贺朱雀三号首飞成功入轨!国产时序数据库 IoTDB 助力火箭试验
数据库·时序数据库·iotdb
dragoooon341 小时前
[C++——lesson14.STL 学习——【string的使用】]
数据库·oracle
羑悻的小杀马特1 小时前
Stream消息队列+地理空间计算+HyperLogLog去重,SCAN安全遍历+RESP协议全解析,一文把它啃透!
数据库·redis·安全·缓存·空间计算·resp
ao_lang1 小时前
MySQL--多版本并发控制(MVCC)
数据库·mysql
JIAWAP1 小时前
Redis数据安全性分析之RDB详解
数据库·redis·分布式·缓存
霸王大陆1 小时前
《零基础学PHP:从入门到实战》教程-模块七:MySQL 数据库基础-5
数据库·mysql·php