mysql批量更新出错

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysql批量更新出错相关的知识,希望对你有一定的参考价值。

### Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLTransactionRollbackException: Deadlock found when trying to get lock; try restarting transaction
; SQL []; Deadlock found when trying to get lock; try restarting transaction; nested exception is com.mysql.jdbc.exceptions.jdbc4.MySQLTransactionRollbackException: Deadlock found when trying to get lock; try restarting transaction
2014-06-09 08:00:01,176 [] ERROR core.JobRunShell - Job DEFAULT.adSspDataTask threw an unhandled Exception:
java.lang.RuntimeException: 11org.springframework.dao.DeadlockLoserDataAccessException:
### Error updating database. Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLTransactionRollbackException: Deadlock found when trying to get lock; try restarting transaction
问题的具体描述在:http://www.iteye.com/problems/101887

这个错误是由于你用了事物,导致表的死锁。 死锁的原因很多,如果你的批量插入有依赖性的话,可能在Mysql里面形成了脏读。
第一步先解决你的死锁问题,用指令show engine innodb status \G 查看是那一个查询进程锁表, 找出来ID,杀掉它。
第二步检查自己的程序的SQL语言,一般批量插入的话尽量用insert into (),(),().... 一个SQL来执行,如果需要检查是否存在然后插入或替换,如果表有唯一索引或主键,用replace, 其他格式一样。
第三步检查你的访问数据库的逻辑,在什么时候进行的commit,你在读写的时候是否设定了独占式访问方法, 或数据库中已经其他的存储过程或触发器同时在操作这个表。

如果以上都无效,你最好是通过上述指令同时监控你的程序并在mysql里面用show process list查看是哪一个ID出了问题。
参考技术A 创建一个表:createtableusers(usernamevarchar(15)notnullPrimaryKey,userpassvarchar(15)notnull);插入一条记录:insertintousersvalues('user1','pass1');再创建一个表:createtableroles(usernamevarchar(15)notnullreferencesusers(username),rolenamevarchar(15));再插入一条记录:insertintorolesvalues('dd','ddd');安分驷皋雁皓孟菑员缴功恪简歧悌燕烁邰战舆颟 参考技术B 我完全明白你的意思,不过我真没见过这种用法还是老老实实在程序里逐个更新,或者用游标(mysql5.0以上版本才支持)吧本回答被提问者采纳

mysql 3张表关联批量更新

user,company,user_role 三张表

user_role里面有user表的id, user表里面有company表的id
现在想把user_role里面role_id =1的update_date 批量更新到company 表pass_date中

mysql 3张表关联批量更新:
mysql更新语句很简单,更新一条数据的某个字段,一般这样写:
代码如下:
UPDATE mytable SET myfield = \'value\' WHERE other_field = \'other_value\';
如果更新同一字段为同一个值,mysql也很简单,修改下where即可:
代码如下:
UPDATE mytable SET myfield = \'value\' WHERE other_field in (\'other_values\');
这里注意 ‘other_values\' 是一个逗号(,)分隔的字符串,如:1,2,3
参考技术A USER
--------------------
Id Company_Id

USER_ROLE
--------------------
User_Id Role_Id Update_Date

COMPANY
--------------------
Pass_Date

推荐使用存储过程实现,以下为伪代码实现:

BEGIN
-- 第一步 : 定义游标,查找到所有 满足条件的 公司标识 和 更新时间
SELECT T1.Update_Date , T2.Company_Id
FROM USER_ROLE T1, USER T2
WHERE T1. User_id = T2.Id
AND T1.ROLE_ID = 1
-- 第二步 : 打开游标,遍历 结果集 ,动态执行 Update

UPDATE Company
SET pass_Date =
WHERE Id =

END;本回答被提问者采纳
参考技术B update_date 时间只有一条记录吗 ? 你是要把 company 表 的所有pass_date字段 都替换?追问

很多,把user role 为1的 company pass_date更新

追答

额 方便把表截图看一下吧 你表述的 没看明白

以上是关于mysql批量更新出错的主要内容,如果未能解决你的问题,请参考以下文章

mysql 批量更新与批量更新多条记录的不同值实现方法

mysql 批量更新与批量更新多条记录的不同值实现方法

MySQL中批量更新 | case when 进行数据批量更新

mysql数据批量更新,谢谢

mybatis 批量更新数据 mysql批量更新数据

mysql 3张表关联批量更新