• 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

  • 相关阅读:
    Flexslider解决多图片刷新闪烁问题
    记一次MySQL授权问题
    AtCoder Beginner Contest 252
    021 指针思考
    Centos 7 添加Wifi驱动
    Java多线程对象内置锁(ObjectMonitor)
    卸载卸载
    mysql8.0安装终结版(mysql忘了密码操作步骤511步骤)
    Oracle实现统计一天的时候记录缺失哪一个时间(以分钟为单位处理的)
    腾讯云配置nginx跳转服务器内部服务
  • 原文地址:https://www.cnblogs.com/softidea/p/5816502.html
Copyright © 2020-2023  润新知