Как использовать транзакции в AdonisJS? - PullRequest
0 голосов
/ 20 июня 2019

Я пытался реализовать простую транзакцию в 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 голосов
/ 26 июня 2019

Если я правильно понял ваш вопрос, вы не хотите сохранять дубликаты строк в базе данных.для этого просто измените ваш файл миграции Product следующим образом и добавьте уникальную опцию в 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
...