我希望有人可以对此有所了解,因为我很困惑。我最近开始对我正在创建的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%的错误跟踪到在计数器缓存行为之后调用的可能长时间运行的查询。