首页 > 解决方案 > `PDOException:SQLSTATE [42000]:语法错误或访问冲突:1305 SAVEPOINT trans2不存在`在Laravel测试中

问题描述

错误

PDOException: SQLSTATE[42000]: Syntax error or access violation: 1305 SAVEPOINT trans2 does not exist

测试

我正在为我的 api 编写测试,但我在测试中遇到了这个奇怪的错误,我使用带有try-catch语句的事务处理自己的一些错误,例如:

public function controllerMethod()
{
    try{
        DB::beginTransaction();

        // do stuff

        DB::commit();

        return response()->json();
    }
    catch(\Exception $e){
        DB::rollback();
    
        return response()->json([], 500);
    }
}

我正在对 MySQL 数据库进行测试并使用该RefreshDatabase特征,据我所知,在这种情况下,由于我没有使用内存数据库,因此该特征执行了一次优化,仅执行一次迁移并将每个测试包装在事务中在每次测试结束时回滚。

当它发生时

正如我所说,错误仅出现在我测试catch分支的正确执行的测试中(通常在那些测试中我从数据库中删除预期的记录以导致异常),而其他测试正常工作:就像打电话给自己一样由于该特性,在测试时DB::rollback()弄乱了 Laravel 的保存点处理。DBRefreshDatabase

只是为了玩它,我将我的回滚语句更改为DB::rollback(DB::transactionLevel() -2 ),这似乎平衡了一切,使测试正常工作,但我无法将此修改用于生产。

我怎么解决这个问题?

标签: mysqllaraveltestingtransactions

解决方案


推荐阅读