用户报告 request_1749193224473 请求出现错误,通过日志分析发现是事务嵌套问题:
[2025-06-06T15:10:47.099459+08:00] laravel.ERROR: check_tr - transaction level >1 事务嵌套 [] [] []
[2025-06-06T15:10:47.115180+08:00] laravel.ERROR: 执行消耗失败 {"user_id":10006,"consume_group":31,"source":"开启宝箱","source_id":27,"error":"transaction level > 1"} []
通过分析调用链发现事务嵌套的原因:
OpenboxHandler 在第57行开启了事务 DB::beginTransaction()ChestService::openChest()ChestService::openChest() 调用 ConsumeService::executeConsume()ConsumeService::executeConsume() 在第127行又开启了一个事务 DB::beginTransaction()ItemService::consumeItem() 中调用 Helper::check_tr() 检查事务状态transaction level > 1 错误修改消耗组服务的事务管理策略,让调用者负责事务管理:
ConsumeService::executeConsume() 方法DB::beginTransaction() 和 DB::commit())\UCore\Db\Helper::check_tr() 确保调用者已开启事务executeCurrencyConsume() 方法executeFundConfigsConsume() 方法use 语句中移除 Illuminate\Support\Facades\DBapp/Module/Game/Services/ConsumeService.php使用验证命令测试修复效果:
php artisan debug:reproduce-error request_1749193224473
修复前:
[2025-06-06T15:10:47.099459+08:00] laravel.ERROR: check_tr - transaction level >1 事务嵌套
修复后:
{
"runUnid": "6842957cb4235",
"runMs": "6093",
"code": "OK",
"callpath": "Item-Openbox",
"deduct": {
"items": [
{"itemId": "2", "quantity": "500"},
{"itemId": "3", "quantity": "500"},
{"itemId": "27", "quantity": "1"}
]
},
"reward": {
"items": [
{"itemId": "2", "quantity": "1622"}
]
}
}
\UCore\Db\Helper::check_tr() 确保事务状态正确修复消耗组服务事务嵌套问题
- 移除ConsumeService::executeConsume()方法中的事务管理
- 移除executeCurrencyConsume()和executeFundConfigsConsume()方法中的事务管理
- 添加事务检查,确保调用者已开启事务
- 修复宝箱开启时的'transaction level > 1'错误
- 所有事务管理现在由调用者(如ChestService::openChest)负责
成功修复了消耗组服务中的事务嵌套问题,通过重构事务管理策略,确保了系统的稳定性。修复后宝箱开启功能正常工作,没有任何错误日志。