MySQL更新死锁问题
作为一个社交类的 App ,我们有很多操作都会同时发生,为了确保数据的一致性,会采用数据库的事物。
比如现在我们有一个点赞操作,点赞成功后,需要更改文章的热度。以下是 SQL 语句:
INSERT INTO user_praise(uid,plan_id,stage_id) VALUES(123456,14456,10023);
UPDATE plan_hot SET hot = hot + 1 WHERE plan_id = 14456;
在这里我们需要用到事物来确保它的原子性,也就是要么这两条语句全部执行成功,要么就全部回滚。
问题出现
在本地这么测试后,发现并没有出现什么问题,但是部署上线后,打印出了错误日志,如下
### Error updating database.
### Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLTransactionRollbackException: Deadlock found when trying to get lock; try restarting transaction ### The error occurred while setting parameters SQL: UPDATE plan_hot SET hot = hot + 1 WHERE plan_id = ?;
错误中提示下面的更新语句出现了死锁
UPDATE plan_hot SET hot = hot + 1 WHERE plan_id = ?;
该问题是第一次遇到,大概也知道是哪里出现了死锁,就是更新 hot = hot + 1 的时候,hot 可能会被一个锁锁住,而下一个操作就需要等待释放锁,然后才能获取到 hot 的值,进行 hot = hot + 1。如果操作过快的话,可能就会造成死锁。
但是还是不懂为什么会这样,根本原因是什么,于是查资料,发现有一个小伙伴解释得蛮清晰的,下面是他的博文。
分析解决
问题分析及解决方案参考
MySQL更新死锁问题
谢谢他的分享,也希望更多的朋友能分享经验。
http://www.tuicool.com/articles/nQniiaa
转载于:https://www.cnblogs.com/softidea/p/5816502.html
MySQL更新死锁问题相关推荐
- 关于MySQL的死锁问题
本文来说下关于MySQL的死锁问题 文章目录 什么是死锁 InnoDB锁类型 间隙锁( gap lock ) next-key lock 意向锁( Intention lock ) 插入意向锁( In ...
- mysql并发死锁问题解决
一般根据多条件过滤后更新update在高并发的时候会导致死锁,进而事务失败.解决办法就是为表增加主键,先查询出主键,再按主键更新,避免死锁. 这是因为mysql行级锁并不是直接锁记录,而是锁索引,如果 ...
- mysql数据库死锁几种情况
mysql数据库死锁的产生原因及解决办法 数据库和操作系统一样,是一个多用户使用的共享资源.当多个用户并发地存取数据 时,在数据库中就会产生多个事务同时存取同一数据的情况.若对并发操作不加控制就可能会 ...
- 记一次mysql数据库死锁实验
概述 之前接触到的数据库死锁,很多都是批量更新时加锁顺序不一致而导致的死锁,但是上周却遇到了一个很难理解的死锁.借着这个机会又重新学习了一下mysql的死锁知识以及常见的死锁场景.今天不介绍死锁的基本 ...
- 新的mysql如何使用_如何使用新的MySQL更新日志
使用新的MySQL更新日志的方法未必人人都会,下面就教您如何使用新的MySQL更新日志的方法,希望对您能够有所帮助.如果你只使用一 使用新的MySQL更新日志的方法未必人人都会,下面就教您如何使用新的 ...
- mysql更新日志问题
[root@localhost ~]# /etc/init.d/mysqld restart 停止 mysqld: [确定] 正在启动 mysqld: [确定] 故障:今天在维护以前数据库日志的时候, ...
- mysql更新字符串中某个字符串_mysql更新某个字符串字段的部分内容
如果现在需要Mysql更新字段重部分数据,而不是全部数据,应该采用何种方法呢?下面介绍了两种情况下Mysql更新字段中部分数据的方法,供您参考. Mysql更新字段中部分数据第一种情况: update ...
- mysql更新多条数据6_mysql语句:批量更新多条记录的不同值
mysql更新语句很简单,更新一条数据的某个字段,一般这样写: 如果更新同一字段为同一个值,mysql也很简单,修改下where即可: 这里注意 'other_values' 是一个逗号(,)分隔的字 ...
- Mysql更新字段中部分数据的方法
如果现在需要Mysql更新字段重部分数据,而不是全部数据,应该采用何种方法呢?下面介绍了两种情况下Mysql更新字段中部分数据的方法,供您参考. Mysql更新字段中部分数据第一种情况: update ...
- mysql 条件触发器_具有条件的MySQL更新触发器(MySQL Update Trigger with Conditions)
具有条件的MySQL更新触发器(MySQL Update Trigger with Conditions) 我有一个PHP应用程序,通过TEST15将'Pass','Fail'或'NA'插入到字段TE ...
最新文章
- 关于端口映射的一个命令
- Linux jupyter安装位置,Linux下安装jupyter
- PhpStrom xdeubg jet ide support
- centos7.6成功安装nerdtree插件
- Vector和ArrayList区别
- 使用Apache Felix文件安装配置OSGi服务
- Maven中Spring-Data-Redis存储对象(redisTemplate)
- 计算机学院网络与新媒体,网络与新媒体专业课程描述.PDF
- SIM800C 使用基站定位
- 送给女朋友的情人节礼物---超贴心小程序
- 电子专业 英语词汇大全(持续更新)
- FANUC机器人示教器介绍
- Windows中的SID详解
- RC电路 波形分析
- 2022-1-17第三章机器学习基础--网格搜索超参数优化、决策树、随机森林
- ViewData与ViewBag的区别是什么
- oracle直接路径读,direct path read直接路径读
- 工作室官网整站源码有后台
- Vue项目管理器中 安装及使用Monaco Editor
- 计算机系学生未来憧憬,北京科技大学计算机与通信工程学院-脚踏实地,展望未来——计通学院2018级本科生年级会...