用户报告农贸市场挂单功能出现错误,通过日志分析发现是事务嵌套问题:
[2025-06-20T16:44:19.050616+08:00] laravel.ERROR: check_tr - transaction level >1 事务嵌套 [] [] []
[2025-06-20T16:44:19.073603+08:00] laravel.ERROR: 创建挂单失败 {"error":"创建订单失败:transaction level > 1"}
通过分析调用链发现事务嵌套的原因:
AddHandler 在第56行开启了事务 DB::beginTransaction()MexOrderService::createSellOrder()MexOrderService::createSellOrder() 调用 MexOrderLogic::createSellOrder()MexOrderLogic::createSellOrder() 在第47行又开启了一个事务 DB::transaction()ItemService::freezeItem() 中调用 Helper::check_tr() 检查事务状态transaction level > 1 错误根据项目规范"逻辑层不能开启事务,需要事务进行事务开启检查",修改Mex模块的事务管理策略:
MexOrderLogic::createSellOrder() 方法DB::transaction() 事务管理\UCore\Db\Helper::check_tr() 确保调用者已开启事务修改前:
return DB::transaction(function () use ($userId, $itemId, $quantity, $price, $currencyType, $totalAmount) {
try {
// 业务逻辑
} catch (\Exception $e) {
return ['success' => false, 'message' => '创建订单失败:' . $e->getMessage()];
}
});
修改后:
// 检查事务状态,确保调用者已开启事务
\UCore\Db\Helper::check_tr();
try {
// 业务逻辑
} catch (\Exception $e) {
return ['success' => false, 'message' => '创建订单失败:' . $e->getMessage()];
}
MexOrderLogic::createBuyOrder() 方法\UCore\Db\Helper::check_tr() 确保调用者已开启事务使用 php artisan debug:reproduce-error 69001992 命令重现错误请求:
修复前:
修复后:
\UCore\Db\Helper::check_tr() 确保事务状态正确修复Mex模块事务嵌套问题
- 移除MexOrderLogic::createSellOrder()方法中的DB::transaction()
- 移除MexOrderLogic::createBuyOrder()方法中的事务管理
- 添加事务检查,确保调用者已开启事务
- 修复农贸市场挂单时的'transaction level > 1'错误
- 所有事务管理现在由调用者(AddHandler)负责
成功修复了Mex模块中的事务嵌套问题,通过重构事务管理策略,确保了系统的稳定性。修复后农贸市场挂单功能正常工作,没有任何错误日志。这次修复遵循了项目的架构规范,将事务管理责任明确分配给了合适的层级。