【MySQL】Deadlock found when trying to get lock; try restarting trans
初始化数据
CREATE TABLE `t_test` (`FID` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',`FCREATE_TIME` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',`FMODIFY_TIME` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',`FUSER_ID` varchar(20) NOT NULL COMMENT '用户id',`FLINKMAN_ID` varchar(20) NOT NULL COMMENT '联系人id',`FUNREAD_COUNT` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '消息未读数',`FLAST_MSG_ID` bigint(20) unsigned DEFAULT NULL COMMENT '最后一条消息id',PRIMARY KEY (`FID`) USING BTREE,KEY `idx_last_msg_id` (`FLAST_MSG_ID`) USING BTREE
) ENGINE=InnoDB ROW_FORMAT=DYNAMIC COMMENT='测试(会话)';INSERT INTO t_test(FID, FUSER_ID, FLINKMAN_ID, FUNREAD_COUNT, FLAST_MSG_ID) VALUES(1, 'A', 'B', 0, 1000)
INSERT INTO t_test(FID, FUSER_ID, FLINKMAN_ID, FUNREAD_COUNT, FLAST_MSG_ID) VALUES(2, 'B', 'A', 0, 1000)
问题重现(简化版)
事务1与事务2并发执行
事务1
-- 时间1:用户A给其联系人B发消息,调用业务接口,开启事务
START transaction ;-- 时间3:更新会话A-B的最后一条消息
UPDATE t_test SET FLAST_MSG_ID = 1001
WHERE FID = 1;-- 时间5:更新会话B-A的未读数和最后一条消息
UPDATE t_test SET FUNREAD_COUNT = FUNREAD_COUNT + 1, FLAST_MSG_ID = 1001
WHERE FID = 2;COMMIT;
事务2
-- 时间2:用户B给其联系人A发消息,调用业务接口,开启事务
START transaction;-- 时间4:更新会话B-A的最后一条消息
UPDATE t_test SET FLAST_MSG_ID = 1002
WHERE FID = 2;-- 时间6:更新会话A-B的未读数和最后一条消息
-- 此时报错:Deadlock found when trying to get lock; try restarting transaction!!!
UPDATE t_test SET FUNREAD_COUNT = FUNREAD_COUNT + 1, FLAST_MSG_ID = 1002
WHERE FID = 1;COMMIT;
解决
使用 分布式锁+开启本地事务+执行业务逻辑(执行多条sql)+提交本地事务+释放分布式锁,且这个分布式锁的key要设计合理,才能避免死锁。
本示例中每个用户都有类型:客户/经纪人,那么就可以将分布式锁的key设计为场景前缀+客户id+经纪人id。譬如:A用户是客户,B用户是经纪人,那么线程1和线程2都是计算出key=REDISSON:SEND_MSG:A:B
,都要先抢夺同一个分布式锁,就不会出现MySQL
的死锁了!
【MySQL】Deadlock found when trying to get lock; try restarting trans相关推荐
- Deadlock found when trying to get lock; try restarting transaction
报错详情 Error updating database. Cause: com.mysql.cj.jdbc.exceptions.MySQLTransactionRollbackException ...
- Deadlock found when trying to get lock; try restarting transaction主要要是死锁问题呢怎么解决
目录 问题描述: 问题发生原因: 问题日志详情: 问题描述: 生产启动的时候,定期排查的 一些日志,发现一个问题呢,主要是加锁了,很奇怪,主要是业务数据的一般的CURD.至于其他的很奇怪!主要查看业务 ...
- PHP mysql数据迁移,【MySQL】迁移数据目录php-php教程
move dir # mv /var/libmysql /mnt/data/ vi /etc/my.cnf [mysqld] // 服务器端 datadir=/mnt/data/mysql socke ...
- shell实行mysql语句_【Mysql】shell运行mysql的sql语句_MySQL
bitsCN.com [Mysql]shell运行mysql的sql语句 shell本身是一种脚本语言,所以不能像java一样通过api去连接数据库.shell还是要借助mysql本身的一些运行脚本才 ...
- 【MySQL】ERROR 1045 (28000): Access denied for user的解决方法
[MySQL]ERROR 1045 (28000): Access denied for user的解决方法 参考文章: (1)[MySQL]ERROR 1045 (28000): Access de ...
- mysql8自定义安装位置_【MySQL】Windows10:MySQL 8 自定义路径安装
目录 一.MySQL官网下载 二.MySQL安装 三.mysql常用登录和快捷进入cmd操作 一.MySQL官网下载 (一)MySQL下载地址:https://dev.mysql.com/downlo ...
- 【MySQL】MHA部署与MasterFailover代码分析
[MySQL]MHA部署与MasterFailover代码分析 官网:https://code.google.com/p/mysql-master-ha/ 参考:http://blog.csdn.ne ...
- 【MySQl】MyISAM和InnoDB索引对比
[MySQl]MyISAM和InnoDB索引对比 部分内容转自:http://www.2cto.com/database/201211/172380.html 比较好的文章:http://www.cn ...
- 阿里巴巴对Java编程【Mysql】的规约
转载自 阿里巴巴对Java编程[Mysql]的规约 建表规约 1. [强制]表达是与否概念的字段,必须使用 is _ xxx 的方式命名,数据类型是 unsigned tinyint( 1 表示是,0 ...
- 【转】2.3【MySQL】运行原理(三)InnoDB 逻辑存储结构
MySQL的存储结构分为5级:表空间.段.簇.页.行. 1.表空间 TableSpace 上篇[MySQL]从InnoDB的内存结构.磁盘结构到update sql执行过程分析 在磁盘结构部分就说过了 ...
最新文章
- 案例 | 杭州佰勤医疗器械:智办事助力企业组织数字化转型
- iOS官方Sample大全
- 第三个spring冲刺第5、6、7天(三天汇总)
- 新编辑神器,可以在终端运行 Jupyter Notebook 了!
- spark 免密码登录- ssh 指定非22端口
- ASP.NET 4.0尚未在Web服务器上注册。您需要手动将Web服务器配置为使用ASP.NET,这样您的网站才能正确运行。...
- 雅虎辉煌不再,紫色血液永存
- html5证书,免费获得微软MCSD证书赶快行动吧!_html5教程技巧
- 从分析***方式来谈如何防御DDoS***
- 通过tomcat配置solr 4.10.3
- WPE封包外挂教程(下)
- Win7系统自带 计算器 详细使用方法
- 计算机二级office应用与设计,全国计算机等级考试二级教程——MS Office高级应用与设计(2021年版)...
- JNI 方法大全及使用示例
- 金融系列-会计基础知识
- 认识越南语的发音体系
- ngx-markdown 安装和使用
- 带你了解什么是MySQL数据库(八)数据库锁机制
- 017_编写一个点名器脚本
- 数据安全--1--专栏开篇作-数据安全概念及架构