我一直试图在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。
我在这里想念东西吗?
答案 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