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

三、产生死锁的原因

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

四、解决方案

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

相关推荐
熊文豪11 小时前
当技术遇见生命:金仓数据库温暖医疗每一刻
数据库·kingbasees·金仓数据库·电科金仓
数据知道11 小时前
【Flask】一文掌握 Flask 基础用法
数据库·后端·python·flask·python web
g***727012 小时前
【MySQL】数据库和表的操作
数据库·mysql·oracle
m***98212 小时前
万字详解 MySQL MGR 高可用集群搭建
android·mysql·adb
zyplayer-doc12 小时前
目录支持批量操作,文档增加可见范围、锁定功能,PDF查看优化,zyplayer-doc 2.5.8 发布啦!
数据库·人工智能·pdf·编辑器·飞书·石墨文档
“αβ”12 小时前
MySQL库的操作
linux·服务器·网络·数据库·c++·mysql·oracle
TDengine (老段)12 小时前
TDengine 转化函数 TO_CHAR 用户手册
大数据·数据库·物联网·时序数据库·iot·tdengine·涛思数据
数据库学啊12 小时前
国产时序数据库选型分析:聚焦 TDengine
数据库·时序数据库·tdengine
q***547512 小时前
【MySQL】表的相关操作
android·mysql·adb
g***557512 小时前
【mysql部署】在ubuntu22.04上安装和配置mysql教程
android·mysql·adb