如何在AdonisJS中使用事务?

时间:2019-06-20 01:11:48

标签: javascript knex.js adonis.js

我一直试图在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。

我在这里想念东西吗?

1 个答案:

答案 0 :(得分:0)

如果我正确理解了您的问题,则您不想在数据库中保存重复的行。为此,只需更改您的产品迁移文件,然后为名称枚举添加唯一选项即可。

'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