初始化数据

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相关推荐

  1. Deadlock found when trying to get lock; try restarting transaction

    报错详情 Error updating database.  Cause: com.mysql.cj.jdbc.exceptions.MySQLTransactionRollbackException ...

  2. Deadlock found when trying to get lock; try restarting transaction主要要是死锁问题呢怎么解决

    目录 问题描述: 问题发生原因: 问题日志详情: 问题描述: 生产启动的时候,定期排查的 一些日志,发现一个问题呢,主要是加锁了,很奇怪,主要是业务数据的一般的CURD.至于其他的很奇怪!主要查看业务 ...

  3. PHP mysql数据迁移,【MySQL】迁移数据目录php-php教程

    move dir # mv /var/libmysql /mnt/data/ vi /etc/my.cnf [mysqld] // 服务器端 datadir=/mnt/data/mysql socke ...

  4. shell实行mysql语句_【Mysql】shell运行mysql的sql语句_MySQL

    bitsCN.com [Mysql]shell运行mysql的sql语句 shell本身是一种脚本语言,所以不能像java一样通过api去连接数据库.shell还是要借助mysql本身的一些运行脚本才 ...

  5. 【MySQL】ERROR 1045 (28000): Access denied for user的解决方法

    [MySQL]ERROR 1045 (28000): Access denied for user的解决方法 参考文章: (1)[MySQL]ERROR 1045 (28000): Access de ...

  6. mysql8自定义安装位置_【MySQL】Windows10:MySQL 8 自定义路径安装

    目录 一.MySQL官网下载 二.MySQL安装 三.mysql常用登录和快捷进入cmd操作 一.MySQL官网下载 (一)MySQL下载地址:https://dev.mysql.com/downlo ...

  7. 【MySQL】MHA部署与MasterFailover代码分析

    [MySQL]MHA部署与MasterFailover代码分析 官网:https://code.google.com/p/mysql-master-ha/ 参考:http://blog.csdn.ne ...

  8. 【MySQl】MyISAM和InnoDB索引对比

    [MySQl]MyISAM和InnoDB索引对比 部分内容转自:http://www.2cto.com/database/201211/172380.html 比较好的文章:http://www.cn ...

  9. 阿里巴巴对Java编程【Mysql】的规约

    转载自 阿里巴巴对Java编程[Mysql]的规约 建表规约 1. [强制]表达是与否概念的字段,必须使用 is _ xxx 的方式命名,数据类型是 unsigned tinyint( 1 表示是,0 ...

  10. 【转】2.3【MySQL】运行原理(三)InnoDB 逻辑存储结构

    MySQL的存储结构分为5级:表空间.段.簇.页.行. 1.表空间 TableSpace 上篇[MySQL]从InnoDB的内存结构.磁盘结构到update sql执行过程分析 在磁盘结构部分就说过了 ...

最新文章

  1. 案例 | 杭州佰勤医疗器械:智办事助力企业组织数字化转型
  2. iOS官方Sample大全
  3. 第三个spring冲刺第5、6、7天(三天汇总)
  4. 新编辑神器,可以在终端运行 Jupyter Notebook 了!
  5. spark 免密码登录- ssh 指定非22端口
  6. ASP.NET 4.0尚未在Web服务器上注册。您需要手动将Web服务器配置为使用ASP.NET,这样您的网站才能正确运行。...
  7. 雅虎辉煌不再,紫色血液永存
  8. html5证书,免费获得微软MCSD证书赶快行动吧!_html5教程技巧
  9. 从分析***方式来谈如何防御DDoS***
  10. 通过tomcat配置solr 4.10.3
  11. WPE封包外挂教程(下)
  12. Win7系统自带 计算器 详细使用方法
  13. 计算机二级office应用与设计,全国计算机等级考试二级教程——MS Office高级应用与设计(2021年版)...
  14. JNI 方法大全及使用示例
  15. 金融系列-会计基础知识
  16. 认识越南语的发音体系
  17. ngx-markdown 安装和使用
  18. 带你了解什么是MySQL数据库(八)数据库锁机制
  19. 017_编写一个点名器脚本
  20. 数据安全--1--专栏开篇作-数据安全概念及架构

热门文章

  1. 股票大作手回忆录投机感悟
  2. Android 自定义高德地图比例尺
  3. python 批量打印PDF
  4. 经纬财富:东莞炒白银怎么做好风险控制
  5. 值得分享的炒白银技巧有哪些?
  6. UK EU 码对照表,USA EURO SIZE码对照表 国外衣服码对照表
  7. MPI和OpenMP实现矩阵相乘
  8. 程序员常用 英语单词
  9. ios微信消息自动朗读_如何使您的iOS设备大声朗读文章,书籍和更多内容
  10. google提供的blog搜索网址