CNode

请教一个mysql事务问题

问答
Ggxsandzxl发布于5 年前最后回复5 年前4 回复3344 浏览0 收藏

项目中每天会去请求数据库查询数据,用到了事务来创建临时表,第一次查询的时候没问题,第二次查询的时候报错表格已建立,以下是代码。

  async handler() {
    this.connection = await this.pMysql.getConnection()
    await this.connection.beginTransaction()
    try {
      const limit = pLimit(10) // p-limit库
      let promise = []
      promise.push(limit(() => this.doSomething1()))
      promise.push(limit(() => this.doSomething2()))
      promise.push(limit(() => this.doSomething3()))
      promise.push(limit(() => this.doSomething4()))
      // ...

      await Promise.all(promise)

      await this.connection.commit()
      await this.connection.release()
    } catch (e) {
      await this.connection.rollback()
      await this.connection.release()
      throw e
    }
  }

问题可以通过删除表来解决。但我想知道为什么第二次创建临时表会报错?临时表不是和connection的生命周期绑定的吗?

查看回复

回复 (3)

X
xinggsf#1·5 年前

应该用:

  try {
  } finally {
  }

问题是await this.connection.release()语句重复导致?

G
gxsandzxl#2·5 年前
引用 xinggsf应该用: 问题是await this.connection.release()语句重复导致?

@xinggsf 应该不是,报错里没有写release出错了

Z
zhennann#3·5 年前

@gxsandzxl this.connection = await this.pMysql.getConnection() 这行语句是从连接池中取数据库连接实例。release()仅仅是释放连接实例到连接池,并没有销毁。因此所属的连接会话仍然存在,与会话相关的资源仍然存在

参与回复
登录后即可参与回复。登录