【问题标题】:Transaction cannot be rolled back because it has been finished事务无法回滚,因为它已经完成
【发布时间】:2020-08-14 20:50:22
【问题描述】:

我正在尝试创建订单并将订单与产品和数量相关联:

const t = await sequelize.transaction();
  try {
    const local_orderInstance = await LocalOrder.create({
      user: req.body.client,
      timestamp: Date.now(),
    }, {transaction: t})
    for(let order_item of req.body.items) {
      const order_itemInstance = await LocalOrderItem.create({
        quantity: order_item.quantity,
        ProductReference: order_item.reference,
        LocalOrderId: local_orderInstance.id
      }, {transaction: t})
      await t.commit()
      res.json({message: `successfully saved order`})
    }
  } catch(error) {
    await t.rollback()
    res.status(503).json(error)
  }

正如您所看到的,它与 sequelize 文档中的示例非常相似,但是发生了一件奇怪的事情,即使数据库中的所有插入都没有错误(调用 t.commit()),显然它仍然进入捕获部分并尝试回滚。之后我收到错误“事务无法回滚,因为它已完成状态:提交” 为什么即使没有抛出异常,它也会尝试执行 catch 部分? 我也收到了这个“[DEP0018] DeprecationWarning:不推荐使用未处理的承诺拒绝。将来,未处理的承诺拒绝将使用非零退出代码终止 Node.js 进程。”它真的要我尝试回滚吗?好吧,我试过了,我收到“错误 [ERR_HTTP_HEADERS_SENT]:在将标头发送到客户端后无法设置标头” nodejs坏了吗?

【问题讨论】:

  • 可能你在一次迭代中调用了提交,但在接下来的某个地方失败了
  • 你应该在循环之后提交。或每次迭代创建新的事务对象。
  • 哦,我没有意识到我在循环中犯了该死的
  • 很好解决了,谢谢,我想我需要休息一下:D
  • 很高兴它有帮助:)

标签: javascript node.js sequelize.js


【解决方案1】:

你应该在循环之后提交。或者每次迭代都创建新的事务对象。

const t = await sequelize.transaction();
  try {
    const local_orderInstance = await LocalOrder.create({
      user: req.body.client,
      timestamp: Date.now(),
    }, {transaction: t})
    for(let order_item of req.body.items) {
      const order_itemInstance = await LocalOrderItem.create({
        quantity: order_item.quantity,
        ProductReference: order_item.reference,
        LocalOrderId: local_orderInstance.id
      }, {transaction: t})  
    }
    await t.commit() // <--- move outside of loop
    res.json({message: `successfully saved order`})
  } catch(error) {
    await t.rollback()
    res.status(503).json(error)
  }

【讨论】:

    猜你喜欢
    • 2018-04-25
    • 2013-10-21
    • 2017-10-15
    • 1970-01-01
    • 2014-11-17
    • 1970-01-01
    • 2019-05-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多