繁体   English   中英

如何在AdonisJS中使用交易?

[英]How to use Transactions in AdonisJS?

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

我在这里错过了什么吗?

如果我正确理解了您的问题,您不希望在数据库中保存重复的行。 为此,只需更改此类产品迁移文件,并为name colume添加唯一选项。

'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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM