新手请教mysql 锁超时和死锁问题.先谢谢了!

qq_38804669 2017-08-19 06:49:22
公司数据是从Kafka中消费下来的,


这张图是根据传过来的数据 获取几个字段的值生产一个hashid,然后再根据hashid到数据库中查找,存在相同的hashid值得数据就删除,不存在就略过,直接进行下一步(下一步还是拼sql,进行插入)
(代码中的hashid值是由实体类中的5个字段的值和1个字符串"1"生成的)



这段是最终都是执行的插入(insert)代码

总的来说就是,存在相同的hashid就做删除,然后在插入,其实就是更新操作,如果不存在相同的hashid,就直接做插入操作,

以下是实体类和数据库表结构






然后今天看运行的日志.就报这俩错误

Lock wait timeout exceeded; try restarting transaction (锁超时)

Deadlock found when trying to get lock; try restarting transaction (死锁)
这是日志截图



然后.,我也是去查各种帖子和讨论,大概看出点门道来,跟什么索引有关,说什么两个sql都各占用了一个资源,等待另一个释放资源.这样就造成了死锁, 可是本人才疏学浅,针对我这个代码.不知道从何改起,,还望大神们帮帮看看!!谢谢了!
,
...全文
382 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
OwenZeng_DBA 2017-08-21
  • 打赏
  • 举报
回复
引用 1 楼 qq_38804669 的回复:
哦哦,忘说了. 公司用的play框架, 框架里有个job 定时任务,每个定时任务就会开启一个线程,所以.消费这些说句的代码就是在这些线程里的
不好意思,昨天没有上CSDN。首先你的问题分为2种,一种是死锁,一种是阻塞。然后首先你要找到,发现问题才能解决问题: 对于死锁,用下面命令找到引起死锁的语句,然后针对语句进行优化,从而解决问题。 show engine innodb status \G; 对于阻塞: select r.trx_id waiting_trx_id, r.trx_mysql_thread_Id waiting_thread, r.trx_query waiting_query, b.trx_id blocking_trx_id, b.trx_mysql_thread_id blocking_thread, b.trx_query blocking_query from information_schema.innodb_lock_waits w inner join information_schema.innodb_trx b on b.trx_id = w.blocking_trx_id inner join information_schema.innodb_trx r on r.trx_id = w.requesting_trx_id; 总的,先找到语句再说
qq_38804669 2017-08-19
  • 打赏
  • 举报
回复
哦哦,忘说了. 公司用的play框架, 框架里有个job 定时任务,每个定时任务就会开启一个线程,所以.消费这些说句的代码就是在这些线程里的

22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧