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操作成功

三、产生死锁的原因

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

四、解决方案

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

相关推荐
InfinteJustice4 小时前
CSS如何创建响应式导航栏菜单_结合Flexbox与媒体查询
jvm·数据库·python
粉嘟小飞妹儿4 小时前
Python环境PyTorch分布式训练初始化失败_检查MASTER_ADDR与端口
jvm·数据库·python
粉嘟小飞妹儿4 小时前
PHP怎么使用Eloquent Attribute Synthesis属性合成_Laravel多源数据融合【指南】
jvm·数据库·python
m0_640309304 小时前
用Symfony构建AI驱动的Web应用实战
jvm·数据库·python
qq_206901394 小时前
CSS如何选择同级中的第一个元素_通过-first-child伪类实现
jvm·数据库·python
gzxdale4 小时前
数据库配置文件密码加解密
数据库
满天星83035774 小时前
【MySQL】索引
linux·服务器·数据库·mysql
InfinteJustice4 小时前
mysql如何设计积分系统_mysql流水账与余额对账
jvm·数据库·python
NotFound4864 小时前
Golang怎么实现防重复提交_Golang如何用Token机制防止表单重复提交【技巧】
jvm·数据库·python
2401_865439635 小时前
CSS如何实现图片自动裁剪填充_巧用object-fit属性控制尺寸
jvm·数据库·python