MySQL更新死锁问题
2016-08-29 01:04
387 查看
作为一个社交类的 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;
在这里我们需要用到事物来确保它的原子性,也就是要么这两条语句全部执行成功,要么就全部回滚。
错误中提示下面的更新语句出现了死锁
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
比如现在我们有一个点赞操作,点赞成功后,需要更改文章的热度。以下是 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更新死锁问题
- MySQL更新死锁问题
- mysql的插表以及更新操作导致的死锁问题
- mysql中两表更新时产生的奇葩问题,产生死锁!
- MySQL更新死锁问题
- MySQL更新死锁问题
- Mysql的死锁问题解决Locked状态
- mysql更新数据limit问题
- MySQL性能问题剖析----死锁
- 【mysql】事务死锁问题
- mysql读写锁与死锁问题
- mysql 插入更新多条数据的效率问题
- mysql 高并发更新计数问题
- 巧用MySQL InnoDB引擎锁机制解决死锁问题
- MySQL一次死锁的问题
- mysql kill process解决死锁问题,停用某条正在执行的语句
- Mysql 问题汇总(不断更新中...)
- Mysql的XML字段部分结点更新问题
- MySQL 主从更新滞后问题
- 我遇到的mysql问题(连续更新)