zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    learning scala view collection
    scala
    learning scala dependency injection
    learning scala implicit class
    learning scala type alise
    learning scala PartialFunction
    learning scala Function Recursive Tail Call
    learning scala Function Composition andThen
    System.Threading.Interlocked.CompareChange使用
    System.Threading.Monitor的使用
  • 原文地址:https://www.cnblogs.com/softidea/p/5816502.html
Copyright © 2011-2022 走看看