我最近在项目中遇到了僵局问题,我正在寻求对其起源的一些见解。
场景如下:
SQLSTATE[40001]: Serialization failure: 1213 Deadlock found when trying to get lock; try restarting transaction (SQL: update `pre_txns_2403` set `status` = SUCCESS, `response_code` = 0, `response_msg` = SUCCESS, `ipay_error` = TXN, `ipay_desc` = Transaction Successful, `sp_transid` = 407508316340, `opr_id` = 407508316340, `res_dt` = 2024-03-15 08:00:14, `optional1` = 607264, `optional2` = 9935558558, `optional3` = CENTRAL BANK OF INDIA, `optional4` = 5044.00, `optional5` = e46944ca4251477b92842311c55f5e1e, `optional6` = , `optional7` = , `optional8` = , `optional9` = , `remarks1` = 316340, `remarks2` = , `remarks3` = , `remarks4` = YWY3OTAzYzNlM2ExZTJlOdjuLnfS78RXTDsN1fnMZcU=, `remarks5` = 3991805, `remarks6` = 431501, `remarks7` = 64a43d40-642e-4fa1-84d1-3f7034aa34c2, `remarks8` = , `remarks9` = , `remarks10` = , `remarks11` = , `remarks12` = , `remarks13` = , `remarks14` = , `remarks15` = LARAVEL where `ipay_id` = P240315080011LZNVJ)
此外,我想阐明错误的触发点:
try {
DB::connection($db . '__write')->beginTransaction();
$transaction = DB::connection($db . '__write')->table($table)->where('ipay_id', $validatedData['ipayId']);
$transaction->update($data);
DB::connection($db . '__write')->commit();
} catch (\Exception $e) {
return \Ipay::response([
'statusCode' => 'ISE',
'internalCode' => $e->getMessage(),
'internalCodeAppend' => '#UTU1',
]);
}
我的主要困惑源于这样一个事实:当我在本地环境中复制整个操作并多次运行相同的脚本(例如,1 秒内运行 10 次)时,我根本没有遇到任何问题。本地环境和生产环境之间的这种差异让我很困惑为什么会发生僵局。
不幸的是,错误消息没有提供太多信息,我正在努力查明死锁的确切原因。我不确定这是否确实是由查询引起的,或者是否还有其他因素在起作用。
我正在联系社区,收集有关如何追踪和确定此问题根本原因的想法或建议。如果有人对如何有效解决死锁场景或如何分析导致死锁的查询序列有见解或建议,我将非常感谢您的意见。
此外,如果需要,我可以提供我的脚本按顺序执行的查询列表,以获取更多上下文。
感谢大家的帮助和支持。
死锁可能来自于相关表FK上的表锁。确保这些已编入索引。