CakePHP 3 +计数器缓存+ InnoDB死锁

时间:2016-11-03 02:24:40

标签: mysql cakephp innodb cakephp-3.x

我希望有人可以对此有所了解,因为我很困惑。我最近开始对我正在创建的API进行压力测试,当请求达到每秒5次以上时,我开始有80%的失败

  

SQLSTATE [40001]:序列化失败:1213尝试获取锁定时发现死锁;尝试重新启动事务“

我理解死锁的原因,我只是不明白在CakePHP的一个相当长的功能中导致它们的原因,在我的印象模型中我有以下内容:

$this->addBehavior('CounterCache', [
        'Zones' => [
            'impressions_count'
        ],
        'Beacons' => [
            'impressions_count'
        ],
        'Devices' => [
            'impressions_count'
        ],
        'Applications' => [
            'impressions_count'
        ]
    ]);

因此,在每次保存时,我都希望更新每个模型上的impressions_count。

如果我注释掉设备和应用程序它会按预期运行,如果我将它们留在中,我会得到有关死锁的以下信息,并且80%的调用因上述SQL失败而失败。

https://gist.github.com/voycey/43071349d6e1ee899444e0a4ee8ac6ed

从我所看到的死锁是由这个countercache插入引起的,我不明白为什么?做起来似乎很简单。我甚至编写了一个执行相同操作的行为(查找记录,递增计数器并重新保存)

编辑:

我创建了自己的行为来基本上模拟计数器缓存,它基本上只需手动递增字段即可解决90%的问题。但是,我已将剩余的10%的错误跟踪到在计数器缓存行为之后调用的可能长时间运行的查询。

0 个答案:

没有答案