作为一个社交类的 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更新死锁问题相关推荐

  1. 关于MySQL的死锁问题

    本文来说下关于MySQL的死锁问题 文章目录 什么是死锁 InnoDB锁类型 间隙锁( gap lock ) next-key lock 意向锁( Intention lock ) 插入意向锁( In ...

  2. mysql并发死锁问题解决

    一般根据多条件过滤后更新update在高并发的时候会导致死锁,进而事务失败.解决办法就是为表增加主键,先查询出主键,再按主键更新,避免死锁. 这是因为mysql行级锁并不是直接锁记录,而是锁索引,如果 ...

  3. mysql数据库死锁几种情况

    mysql数据库死锁的产生原因及解决办法 数据库和操作系统一样,是一个多用户使用的共享资源.当多个用户并发地存取数据 时,在数据库中就会产生多个事务同时存取同一数据的情况.若对并发操作不加控制就可能会 ...

  4. 记一次mysql数据库死锁实验

    概述 之前接触到的数据库死锁,很多都是批量更新时加锁顺序不一致而导致的死锁,但是上周却遇到了一个很难理解的死锁.借着这个机会又重新学习了一下mysql的死锁知识以及常见的死锁场景.今天不介绍死锁的基本 ...

  5. 新的mysql如何使用_如何使用新的MySQL更新日志

    使用新的MySQL更新日志的方法未必人人都会,下面就教您如何使用新的MySQL更新日志的方法,希望对您能够有所帮助.如果你只使用一 使用新的MySQL更新日志的方法未必人人都会,下面就教您如何使用新的 ...

  6. mysql更新日志问题

    [root@localhost ~]# /etc/init.d/mysqld restart 停止 mysqld: [确定] 正在启动 mysqld: [确定] 故障:今天在维护以前数据库日志的时候, ...

  7. mysql更新字符串中某个字符串_mysql更新某个字符串字段的部分内容

    如果现在需要Mysql更新字段重部分数据,而不是全部数据,应该采用何种方法呢?下面介绍了两种情况下Mysql更新字段中部分数据的方法,供您参考. Mysql更新字段中部分数据第一种情况: update ...

  8. mysql更新多条数据6_mysql语句:批量更新多条记录的不同值

    mysql更新语句很简单,更新一条数据的某个字段,一般这样写: 如果更新同一字段为同一个值,mysql也很简单,修改下where即可: 这里注意 'other_values' 是一个逗号(,)分隔的字 ...

  9. Mysql更新字段中部分数据的方法

    如果现在需要Mysql更新字段重部分数据,而不是全部数据,应该采用何种方法呢?下面介绍了两种情况下Mysql更新字段中部分数据的方法,供您参考. Mysql更新字段中部分数据第一种情况: update ...

  10. mysql 条件触发器_具有条件的MySQL更新触发器(MySQL Update Trigger with Conditions)

    具有条件的MySQL更新触发器(MySQL Update Trigger with Conditions) 我有一个PHP应用程序,通过TEST15将'Pass','Fail'或'NA'插入到字段TE ...

最新文章

  1. 关于端口映射的一个命令
  2. Linux jupyter安装位置,Linux下安装jupyter
  3. PhpStrom xdeubg jet ide support
  4. centos7.6成功安装nerdtree插件
  5. Vector和ArrayList区别
  6. 使用Apache Felix文件安装配置OSGi服务
  7. Maven中Spring-Data-Redis存储对象(redisTemplate)
  8. 计算机学院网络与新媒体,网络与新媒体专业课程描述.PDF
  9. SIM800C 使用基站定位
  10. 送给女朋友的情人节礼物---超贴心小程序
  11. 电子专业 英语词汇大全(持续更新)
  12. FANUC机器人示教器介绍
  13. Windows中的SID详解
  14. RC电路 波形分析
  15. 2022-1-17第三章机器学习基础--网格搜索超参数优化、决策树、随机森林
  16. ViewData与ViewBag的区别是什么
  17. oracle直接路径读,direct path read直接路径读
  18. 工作室官网整站源码有后台
  19. Vue项目管理器中 安装及使用Monaco Editor
  20. 计算机系学生未来憧憬,北京科技大学计算机与通信工程学院-脚踏实地,展望未来——计通学院2018级本科生年级会...

热门文章

  1. 【原】涉及数据库的单元测试-JTeser
  2. Quartz时间配置(周期任务)
  3. 简单使用idea Spring Boot搭建项目
  4. OpenCV2:幼儿园篇 第七章 界面事件
  5. 墨者学院——密码学加解密实训(Base64转义)
  6. 第二次作业+105032014049
  7. C# 利用NPOI 实现Excel转html
  8. Mac OS X10.11下CocoaPods的安装过程
  9. arcserver开发小结(三)
  10. 参数利用SpringMVC构建REST接口:第七篇 控制层实现