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

 

时间: 2024-11-01 23:08:44

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

深入分析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; 在这里我们需要用到事物来确保它的原子性,也就是要么这两

Mysql 数据库死锁过程分析(select for update)_Mysql

近期有一个业务需求,多台机器需要同时从Mysql一个表里查询数据并做后续业务逻辑,为了防止多台机器同时拿到一样的数据,每台机器需要在获取时锁住获取数据的数据段,保证多台机器不拿到相同的数据. 我们Mysql的存储引擎是innodb,支持行锁.解决同时拿数据的方法有很多,为了更加简单,不增加其他表和服务的情况下,我们考虑采用select... for update的方式,这样X锁锁住查询的数据段,表里其他数据没有锁,其他业务逻辑还是可以操作. 这样一台服务器比如select .. for upda

jsp 网站开发-jsp连接 mysql 更新语法错误,大家帮我看看,谢谢~

问题描述 jsp连接 mysql 更新语法错误,大家帮我看看,谢谢~ update test set check='1' where memName ='lmy' 解决方案 有可能表中列名不对应或者设置的类型不对应

数据库 mysql 视图-MYsql,更新或插入创建视图的源表,则视图的数据更新需要时间吗?

问题描述 MYsql,更新或插入创建视图的源表,则视图的数据更新需要时间吗? 使用的工具是Navicat for MySql, 主要问题是:我要同步七张表数据,然后根据这七张表创建了一个视图A,然后根据视图A去刷新表B.视图A与表B,数据结构是一致的. 实现过程是用存储过程,先同步七张表,然后直接用视图A去刷新表B.刷新是指使表B与视图A,数据一模一样. 在测试的过程中,当向七张表同步4万条数据时候,发现表B少同步了:六百多条数据. 我猜测是在同步完七张表数据之后,更新视图A需要一定的时间,在视

MySql更新优化策略_MsSql

模拟场景一: 给数据库中的一张表的结构调整,添加几个字段,后面对之前的数据进行刷新,刷新的内容是对其中的一个已有字段url进行匹配,然后更新新加的字段type和typeid. 后来就写了个shell脚本来刷数据,结果运行shell脚本后我就懵了,怎么这么慢~~~ 情景再现 复制代码 代码如下: CREATE TABLE `fuckSpeed` (   `uin` bigint(20) unsigned NOT NULL DEFAULT 0,   `id` int(11) unsigned NOT

MYSQL更新优化实录_Mysql

引言 今天(August 5, 2015 5:34 PM)在给数据库中一张表的结构做一次调整,添加了几个字段,后面对之前的数据进行刷新,刷新的内容是:对其中的一个已有字段url进行匹配,然后更新新加的字段type和typeid.后来就写了个shell脚本来刷数据,结果运行shell脚本后我就懵了,怎么这么慢~~~ 情景再现 CREATE TABLE `fuckSpeed` ( `uin` bigint(20) unsigned NOT NULL DEFAULT 0, `id` int(11) u

【MySQL】死锁案例之三

一 前言       死锁,其实是一个很有意思,也很有挑战的技术问题,大概每个DBA和部分开发朋友都会在工作过程中遇见过.关于死锁我会持续写一个系列的案例分析,希望能够对想了解死锁的朋友有所帮助.二 背景知识2.1 insert 锁机制 在分析死锁案例之前,我们先学习一下背景知识 insert 语句的加锁策略.我们先来看看官方定义: "An insert intention lock is a type of gap lock set by INSERT operations prior to

mysql更新语句执行的时候,如果没有数据不会报错

mysql更新语句执行的时候,如果没有数据不会报错.下面是我做的实验. 首先执行建表语句:CREATE TABLE test (id VARCHAR(20),NAME VARCHAR(20)) 再执行更新语句:UPDATE test SET NAME = '1' WHERE id = '1' 由于刚建立的表,里面什么数据都没有,但是执行完更新语句后没有报错.出现了下图所示的界面:

MySql更新优化策略

模拟场景一: 给数据库中的一张表的结构调整,添加几个字段,后面对之前的数据进行刷新,刷新的内容是对其中的一个已有字段url进行匹配,然后更新新加的字段type和typeid. 后来就写了个shell脚本来刷数据,结果运行shell脚本后我就懵了,怎么这么慢~~~ 情景再现 复制代码 代码如下: CREATE TABLE `fuckSpeed` (   `uin` bigint(20) unsigned NOT NULL DEFAULT 0,   `id` int(11) unsigned NOT