mysql - `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 的保存点处理。DB
RefreshDatabase
只是为了玩它,我将我的回滚语句更改为DB::rollback(DB::transactionLevel() -2 )
,这似乎平衡了一切,使测试正常工作,但我无法将此修改用于生产。
我怎么解决这个问题?
解决方案
推荐阅读
- vb.net - 未定义 Visual Studio 'null'
- sql - Python SQL 中的嵌套查询导致空数据框
- ruby - 如何在 Ruby 中始终如一地获得 ASCII-8BIT 编码?
- kotlin - 如何在 MVVM 中更新实时数据
- google-bigquery - Maxmind 为 GeoLite 提供的 Big Query 公共数据集中是否有英文地理位置数据?
- assembly - NASM 错误:COFF 格式不支持非 32 位重定位
- git - OpenSSL SSL_connect: SSL_ERROR_SYSCALL 连接到 gitlab:443
- ios - 斯威夫特 | 从图像数组中创建视频
- python - 使用 GitHub API 尝试评论拉取请求时收到错误“解析 JSON 的问题”
- javascript - 从通过 DataTables 和 Ajax 进行服务器端数据处理的网站抓取数据