mysql死锁

esyap4oy  于 2021-06-21  发布在  Mysql
关注(0)|答案(1)|浏览(295)

我需要同时将55.tsv文件中的数据导入mysql数据库。
我的任务是使用updateorcreate()方法读取文件并更新数据库中的行。
我的主管配置:

[program:laravel-worker]
process_name=%(program_name)s_%(process_num)02d
command=php /Users/denis/Code/my_project/artisan queue:work --tries=3 --timeout=3600 --daemon
autostart=true
autorestart=true
numprocs=55
stdout_logfile=/Users/denis/Code/my_project/storage/logs/workers.log
stderr_logfile=/Users/denis/Code/my_project/storage/logs/workers_error.log

但是当我这么做的时候,所有的作业都失败了,错误是:
pdoexception:sqlstate[40001]:序列化失败:尝试获取锁时发现1213死锁;尝试在/users/denis/code/myu project/vendor/laravel/framework/src/illuminate/database/connection中重新启动事务。php:474 ...
我可以用try-catch-block解决它

$updated = null;
$db_max_retries = 10;
$db_retry_count = 0;
while($updated == null && $db_retry_count < $db_max_retries) {
    try {
        $updated = AdsPerformance::updateOrCreate(['campaign_id' => $performance_obj['campaign_id'], 'date' => $performance_obj['date'], 'ad_provider' => 'adwords'], $performance_obj);
    } catch (\Exception $e) {
        sleep(1);
        $db_retry_count++;
    }
}
$lines_proceded++;

... 但是在这种情况下,这个过程需要很长的时间,因为在大约2000条导入行中有大约200个死锁。
当表为空时,没有死锁。死锁只在表已经有数据时出现(基本上是在尝试更新时)
我试着用不同的睡眠时间。当sleep=5时,死锁更少。当sleep=1/10秒(我使用usleep(100000))时,会有更多的死锁。顺便说一句,在这些情况下,总的执行时间并没有很大的不同。
我尝试使用其他队列驱动程序(redis和beanstalkd)。但也没有太大的区别。
也许我可以试试别的办法?像mysql配置之类的?我不相信在mysql中没有不死锁的同步更新的解决方案。

mspsb9vt

mspsb9vt1#

好的,只要意识到问题是使用复合主键。为了解决这个问题,我创建了带有连接主键的唯一主键列,并且没有更多的死锁。

相关问题