【问题标题】:How to use Transactions in AdonisJS?如何在 AdonisJS 中使用事务?
【发布时间】:2019-06-20 01:11:48
【问题描述】:

我一直在尝试在 Adonis 中实现一个简单的事务。

场景是我有一个表,它有一个名为 name 的唯一字段,并且想要在 name 中的一项存在时回滚多个创建查询的事务。

const Product = use('App/Models/Product')
const Database = use('Database')

const data = [
  {
    name: 'name1'
  },
  {
    name: 'name2'
  },
  {
    name: 'name3'
  },
  {
    name: 'name4'
  }
]

const trx = await Database.beginTransaction()

try {
  await Product.createMany(data, trx)
  await trx.commit()
  return response.json({
    success: true
  })
} catch (e) {
  await trx.rollback()
  return response.json({
    success: false
  })
}

在上面的代码中,产品 name2、name3、name4 存在,而 name1 不存在。所以现在我们假设当它开始创建name2时,它会抛出一个错误并回滚事务。

但它没有。 name1 仍然被插入并且没有回滚。

也试过了

try {
  await Database.transaction(async (trx) => {
    await trx.insert(data).into('products')
  });
} catch (e) {}

但得到了相同的输出。

顺便说一下,我用的是mysql 5.5。

我错过了什么吗?

【问题讨论】:

  • 一定要发console.error(e)看看有没有错误

标签: javascript knex.js adonis.js


【解决方案1】:

如果我正确理解了您的问题,您不想在数据库中保存重复的行。为此,只需像这样更改您的 Product 迁移文件并将唯一选项添加到 name 列。

'use strict'
/** @type {import('@adonisjs/lucid/src/Schema')} */
const Schema = use('Schema')


class ProductsSchema extends Schema {
  up() {
    this.create('products', (table) => {
      table.increments()
      table.string('name').unique()
      table.timestamps()
    })
  }

  down() {
    this.drop('products')
  }
}


module.exports = ProductsSchema

【讨论】:

  • 对不起。我想你没看懂我的帖子。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-22
  • 2018-05-11
  • 2019-11-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多