You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Japa测试框架+AdonisJS 5时部分测试报错:Transaction query already complete

解决AdonisJS 5 + Japa测试中部分用例触发「Transaction query already complete」错误

错误信息

× Uncaught exception

   Transaction query already complete, run with DEBUG=knex:tx for more info


     1  completedError
       node_modules/knex/lib/execution/transaction.js:396

     2  anonymous
       node_modules/knex/lib/execution/transaction.js:362

     3  Client_MySQL2.trxClient.query
       node_modules/knex/lib/execution/transaction.js:358

     4  Runner.query
       node_modules/knex/lib/execution/runner.js:123

     5  ensureConnectionCallback
       node_modules/knex/lib/execution/internal/ensure-connection-callback.js:13

     6  Runner.ensureConnection
       node_modules/knex/lib/execution/runner.js:300

     7  Runner.run
       node_modules/knex/lib/execution/runner.js:30

     8  QueryRunner.executeQuery
       node_modules/@adonisjs/lucid/build/src/QueryRunner/index.js:78

核心原因

部分测试用例尝试在已完成(提交/回滚)的数据库事务中执行查询,通常由以下场景导致:

  • 异步操作未正确用await等待,导致事务在查询执行前被测试钩子关闭
  • 测试钩子中的事务管理逻辑存在异步遗漏,提前终止了事务
  • 手动事务操作后未正确清理,后续查询复用了已关闭的事务实例

解决方案

1. 强制等待所有异步操作

所有涉及数据库的请求、查询必须用await等待完成,避免事务在操作执行前被回滚:

test('创建用户接口验证', async ({ client }) => {
  // 错误写法:未等待异步请求完成
  // client.post('/users').send({ name: 'foo' })
  
  // 正确写法:用await等待响应
  const response = await client.post('/users').send({ name: 'foo' })
  response.assertStatus(201)
})

2. 检查测试钩子的事务逻辑

AdonisJS 5默认通过全局事务隔离测试数据,确保钩子中的事务操作都用await等待:

// 错误写法:未等待事务启动/回滚
// beforeEach(() => Database.beginGlobalTransaction())
// afterEach(() => Database.rollbackGlobalTransaction())

// 正确写法:等待事务操作完成
beforeEach(async () => await Database.beginGlobalTransaction())
afterEach(async () => await Database.rollbackGlobalTransaction())

3. 规范手动事务的使用

如果测试中手动创建事务,必须确保事务完成后不再复用实例:

test('手动事务操作示例', async () => {
  const trx = await Database.transaction()
  try {
    await trx.from('users').insert({ name: 'bar' })
    await trx.commit()
  } catch (err) {
    await trx.rollback()
  }
  
  // 错误写法:使用已关闭的trx实例查询
  // await trx.from('users').where('name', 'bar')
  
  // 正确写法:使用默认数据库实例
  await Database.from('users').where('name', 'bar')
})

4. 启用事务调试定位问题

按照错误提示,启动测试时添加DEBUG=knex:tx环境变量,查看事务的启动、提交、回滚日志,精准定位违规操作:

DEBUG=knex:tx node ace test

内容的提问来源于stack exchange,提问作者M.Edriss Aria

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 20:05:13