作为一个社交类的 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

MySQL更新死锁问题的更多相关文章

  1. MySql 更新死锁问题 Deadlock found when trying to get lock; try restarting transaction

    文章导航-readme MySql 更新死锁问题 Deadlock found when trying to get lock; try restarting transaction 1.场景 //t ...

  2. MySQL更新死锁问题【转,纯为学习】

    https://blog.csdn.net/a12345555555/article/details/72828366 -08-13 15:12:44 [ERROR] com.zhubajie.cou ...

  3. MySQL更新锁表超时 Lock wait timeout exceeded

    背景 最近在做一个订单的钉钉审批功能,钉钉审批通过之后,订单更新审核状态,然后添加一条付款,并且更新付款状态: // 订单审批通过 @Transactional(rollbackFor = Excep ...

  4. mysql更新某个字符串字段的部分内容

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

  5. 警惕 MySql 更新 sql 的 WHERE 从句中的 IN() 子查询时出现的性能陷阱

    警惕 MySql 更新 sql 的 WHERE 从句中的 IN() 子查询时出现的性能陷阱 以下文章来源:https://blog.csdn.net/defonds/article/details/4 ...

  6. MySQL会发生死锁吗?

    SHOW ENGINE INNODB STATUS;来查看死锁日志: SHOW PROCESSLIST;查看进程 MySQL的InnoDB引擎事务有4种隔离级别,主要是为了保证数据的一致性. Inno ...

  7. mysql更新日志问题

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

  8. mysql更新返回值问题(更新内容跟之前内容一样,返回0)

    mysql更新返回值问题 问: 有一界面要更新个人信息,有几十个text标签需要填写假设有一用户从用户列表点修改进入了修改页面,但又没有修改什么,马上点击保存这时,因为text标签非常多,不能够一一判 ...

  9. [MySQL] 锁/死锁问题一例

    MySQL锁/死锁问题 在MySQL中, 不同事务隔离级别下, 锁的情况表现是不同的, 另外表的设计上有无索引也是一个因素. 做一个小的实验测试InnoDB锁表现 -:) 说明 事务隔离级别 READ ...

随机推荐

  1. Ubuntu runlevel修改

    安装Unbuntu 12.04. 据说Ubunut的一个UI相对友好的Linux版本,但我的需求是仅仅将其作为服务器使用,偶尔用用UI界面.所以我希望启动Ubuntu时,直接进入Shell命令行. 印 ...

  2. eclipse快捷键总结

    一.自定义快捷键 Window->Preferences->General->keys,进入快捷键管理界面,可以修改默认功能的快捷键组合例:修改以下快捷键功能(快捷键组合尽量保持唯一 ...

  3. OpenStack Networking

    今天的数据中心网络比以往不论什么时候包括的设备都要多,比如server.网络设备.存储系统和安全设备等.这当中有非常多被近一步划分为多个虚拟机和虚拟网络.IP地址的数量.路由配置和安全规则能够迅速达到 ...

  4. 网络编程TCP总结及实践-C语言

    网络变成首先要注意IP和port的转换,如今电脑基本上是主机字节序,存储依照小端方式,而在网络中传输统一使用大端方式,所以网络变成首先要注意字节序的转换. 一个经常使用的ip转换程序的实现: #inc ...

  5. 一个好用的Python备份mysql的脚本

    前几天打算用Python写一个mysql脚本,上Google看了下老外写的,写的挺好的,原地址在http://tecadmin.net/python-script-for-mysql-database ...

  6. 安装Linux和Windows的双系统

    平时使用较多的操作系统是Windows,想玩玩Linux平时也是在虚拟机上,强迫症的怎么能忍,一直想装个双系统,也能强迫自己练习Linux命令,之前重装系统的时候也试着装了一下,但是准备不够充分.结果 ...

  7. java反射机制 struts2 获取 action、method、invocation、proxy

    ActionInvocation invocation = ActionContext.getContext().getActionInvocation(); Object action = invo ...

  8. WindowsServer2012 取消密码策略

    1.打开“组策略管理”界面:管理工具 >> 组策略管理,如果找不到该功能,则需要先安装,在“服务管理器”里面“添加新功能”.(或者:开始——运行——gpmc.msc) 2.依次打开“林”& ...

  9. (转)关于c#中的事件

    原文链接http://blog.csdn.net/joyhen/article/details/8500211 如有不明白的地方欢迎加QQ群14670545 探讨 最近在看委托,然后看到事件,以前一直 ...

  10. JAVA List与数组间相互转换

    1.list转数组 例如: List<String> list =  new ArrayList<String>(); list.add("aa"); li ...