多进程导致mysql死锁问题

apud

使用workerman作为rabbitmq的守护进程,开了10个消费进程。
代码中mysql用到事务处理,实际使用中发现会发生死锁问题 导致业务代码无法正常运行。应该是多个进程访问事务导致的。
我目前想到的解决方案:在处理代码之前用redis标记是否有进程在处理,如果有则不往下执行业务(并将当前任务重新推入mq比如3分钟后再执行)   处理完后解锁。
不知道正确的姿势是怎么样的?使用多进程是因为rabbitmq 消费进程在单进程情况下任务一多就会出现 Unacked现象(应该是进程阻塞住了 出现假死现象),不知道是不是任务太多消费进程来不及确认导致的,所以想测试下多进程能否解决这种情况,结果又出现了新的坑。
(随便吐槽下该论坛页面停留过长 不让发帖的BUG)

阅读 2730
4个回答

stephen
apud

  • 暂无评论
yepo

顶,我目前也是遇到这个问题。大神你有解决方法了吗

  • apud 2019-04-27

    把多进程改成单进程执行了。多进程执行同一个代码,同时在执行事务,很有可能会出现这个死锁问题。应该有更好的解决方案,还没有去深入研究。

  • yepo 2019-10-22

    嗯,谢谢;我的解决办法类似:做一个队列服务以单进程链接MySQL,然后将所有原定在程序里的DML(除Select外)操作全部提交给队列处理。当然这样也有缺点,就是如果需要及时返回操作结果的,得要二次请求服务器询问

dignfei

mysql太慢了,换成redis就解决了,简单

  • 暂无评论