一次Mysql 死锁事故
故障描述:
简单描述一下需求:我们写的一个计步器的客户端软件,用户通过手机客户端将用户的运动计步信息传到服务器。
服务器侧记录每个用户每次上传明细,同时每个用户有一个汇总值,参与全省排名。
1.加入明细记录方法
List<EmployeeRecord> list = mEmployeeRecordService.uploadRecord(usercode, token, uploadStr, movement_id);
2.更新统计值(上面明细添加成功后,将实体返回,更新统计值)
this.mEmployeeReportService.updateUserReport(usercode, list);
3.更新统计值中有一个方法用来更新用户在本活动中的排名信息,具体方法如下:
/*** 更新所有人的排名* * @param movementId* :活动编号* @param orderType* 增加排名方式@2013.12.11*/@SuppressWarnings("unchecked")private void updateRanks(String movementId, String orderType) { String updateField = orderType.equals("0") ? "all_sport_steps": "all_sport_distence";String sql = "update tb_c_employee_report as rpt set rpt.current_rank="+ "(select count(1)+1 from (select movement_id,all_sport_steps from tb_c_employee_report) as b where b.movement_id='"+ movementId+ "' and b."+ updateField+ ">rpt."+ updateField+ ")" + "where movement_id='" + movementId + "'";this.jdbcTemplate.execute(sql);
这个巧妙的方法可以用一条sql语句更新用户的排名。
但问题也出在这个语句上:mysql的update语句或insert语句中如果包含select(如insert into select from),将会为select 表加锁(可能是表锁或行锁),而且mysql的行锁是加在索引上的。
这个方法上线后,一开始运行正常。但随着并发数的增加,经常报一个如下的错误:
nested exception is org.hibernate.exception.LockAcquisitionException: Could not execute JDBC batch update
通过mysql的show innodb status查看,产生一个死锁。
解决方案:
网上有很多解决办法。我这里更新排名没有办法了。只能拿出来遍历了。方法虽然傻了点,但每个分公司是一个活动,活动内用户最多也就1000多人。不会有太大效率上的问题。先解决问题。明天再想想有没有别的办法解决。
/*** 更新所有人的排名* * @param movementId* :活动编号* @param orderType* 增加排名方式@2013.12.11*/@SuppressWarnings("unchecked")private void updateRanks(String movementId, String orderType) { //耗效率一点。反正一个活动里的人也不是太多。 String updateField = orderType.equals("0") ? "all_sport_steps": "all_sport_distence"; String sql = "SELECT employee_report_id FROM tb_c_employee_report WHERE movement_id=? ORDER BY " + updateField + " DESC";List<Map<String,Object>> list = this.jdbcTemplate.queryForList(sql, movementId);int i = 1;for(Map<String,Object> map : list){this.jdbcTemplate.execute("UPDATE tb_c_employee_report SET current_rank='"+i+"'" +" WHERE employee_report_id='"+map.get("employee_report_id").toString()+"'");i++;}
附:
http://tech110.blog.51cto.com/438717/268954
这篇文章推荐如果有insert 和 select同时操作时使用MyISAM 表。明天有空试一下。
http://xu20cn.blog.51cto.com/274020/72574
这里有详细的介绍innodb锁机制。
转载于:https://www.cnblogs.com/zhouyu629/p/3519845.html
一次Mysql 死锁事故相关推荐
- mysql死锁介绍以及解决
什么是死锁 死锁是2+个线程在执行过程中, 因争夺资源而造成的相互等待的现象,若无外力作用,它们将无法推进下去. 死锁产生的4个必要条件 互斥条件 指进程对所分配的资源进行排他性使用,即一段时间内某资 ...
- java mysql死锁_记一次线上mysql死锁分析(一)
记录一次比较诡异的mysql死锁日志.系统运行几个月来,就在前几天发生了一次死锁,而且就只发生了一次死锁,整个排查过程耗时将近一天,最后感谢我们的DBA大神和老大一起分析找到原因. 诊断死锁 借助于我 ...
- mysql查询死锁的次数_一次神奇的MySQL死锁排查记录
一次神奇的MySQL死锁排查记录 发布时间:2020-08-29 00:50:26 来源:脚本之家 阅读:135 作者:咖啡拿铁 背景 说起Mysql死锁,之前写过一次有关Mysql加锁的基本介绍,对 ...
- MySQL死锁如何处理
转载自 MySQL死锁如何处理 前提 笔者负责的一个系统最近有新功能上线后突然在预警模块不定时报出MySQL死锁导致事务回滚.幸亏,上游系统采用了异步推送和同步查询结合的方式,感知到推送失败及时进行 ...
- mysql 死锁监视器_并发基础知识:死锁和对象监视器
mysql 死锁监视器 本文是我们名为Java Concurrency Essentials的学院课程的一部分. 在本课程中,您将深入探讨并发的魔力. 将向您介绍并发和并发代码的基础知识,并学习诸如原 ...
- mysql死锁的排查方法_MySQL死锁系列-线上死锁问题排查思路
前言 MySQL 死锁异常是我们经常会遇到的线上异常类别,一旦线上业务日间复杂,各种业务操作之间往往会产生锁冲突,有些会导致死锁异常.这种死锁异常一般要在特定时间特定数据和特定业务操作才会复现,并且分 ...
- go语言 mysql卡死_一次mysql死锁的排查过程-Go语言中文社区
一次mysql死锁的排查过程一.背景17号晚上要吃饭了,看旁边的妹子和佐哥还在调代码,就问了下什么问题啊,还在弄,妹子说,在测试环境测试给用户并发发送卡券时,出现了死锁,但看代码没有死锁,问题如下图 ...
- zabbix监控mysql死锁
percona MySQL Server Template算是比较常用的zabbix监控mysql的模板了,监控项也比较齐全,但是没有监控mysql死锁的监控项,如果有需求,就需要另外创建模板或者监控 ...
- 一次MySQL死锁问题解决
一次MySQL死锁问题解决 一.环境 CentOS, MySQL 5.6.21-70, JPA 问题场景:系统有定时批量更新数据状态操作,每次更新上千条记录,表中总记录数约为500W左右. 二.错误日 ...
- mysql死锁语句_记一次神奇的Mysql死锁排查
背景 说起Mysql死锁,之前写过一次有关Mysql加锁的基本介绍,对于一些基本的Mysql锁或者死锁都有一个简单的认识,可以看下这篇文章为什么开发人员需要了解数据库锁.有了上面的经验之后,本以为对于 ...
最新文章
- Java学习_day013(OOP):内部类
- centos7 yum安装mysql5_Centos7 yum安装mysql5.7
- 王者调整期选股技术之喇叭花开
- 剑指offer——面试题6:重建二叉树
- 虚电路方式,数据报方式
- 011—MySQL 事务
- mac vi快速删除_Mac下Vim编辑快捷键小结
- css权威指南——link
- 试比较瀑布模型、快速原型模型、增量模型和螺旋模型的优缺点,说明每种模型的适用范围。
- php敏感字符串过滤_PHP实现敏感词过滤
- python孩子 哪里学_Python知识免费学!孩子提高逻辑思维,这样练就够了!
- linux系统路由器地址查询,如何在任何平台上查找路由器的IP地址
- 第55届高博会余温未减,中科易安联网智能门锁获全国高校青睐
- D3D11 MD5骨骼动画模型的加载
- 如何解决:Mac 进不去JetBrains官网 Mac 打不开 idea/webstorm/PyCharm官方网站
- 美团王兴的创业三原则
- 数据结构和算法 第二小题 九宫重排(1)
- 百度凤巢系统的关键词
- Trados T-Window的使用方法
- 如何更改计算机启动方式,windows系统启动项如何设置|windows系统启动项怎样更改|windows系统启动项设置方法...
热门文章
- java mojo是什么_java – 为什么Maven不能找到我的定制Mojo?
- linux线程组和进程区别,Linux中进程和线程之间的区别
- java打包----“Artifacts”
- c语言 com组件,com组件 C语言基础.ppt
- 网页设计如何排成一列_学习DIV+CSS网页布局之一列布局
- Html图片懒加载动画,带加载进度的Web图片懒加载组件Lazyload
- linux安装 web2py,TurnkeyLinux上用于Web2Py到MySQL的DAL连接字符串
- 微信的发展堪称疯狂,这 7 点值得所有人学习
- 转 PHP函数---$_Get()和$_Post()的用法
- 关于Java中的final关键字