Откат транзакции knex с использованием необработанных выражений SQL - PullRequest
0 голосов
/ 20 февраля 2020

У меня есть массив необработанных SQL выражений, которые я хочу передать knex.

const rawExpressions = ["CREATE TABLE new_table (id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY, firstname VARCHAR(30) NOT NULL,lastname VARCHAR(30) NOT NULL,email VARCHAR(50))","INSERT INTO new_table (firstname, lastname, email)VALUES (\"Test\", \"Name\", \"name@example.com\")", "INSERT INTO new_table (firstname, lastname, wrongfield) VALUES (\"Another\", \"Name\", \"test@example.com\")"]

knex.transaction(trx => {
  const queries: any[] = [];
  rawExpressions.forEach(async expression => {
    const query = knex.raw(expression).transacting(trx)
    queries.push(query)
  })

  Promise.all(queries)
    .then(trx.commit)
    .catch(trx.rollback)
}).catch(error => console.log('error', error))

Это работает, если ошибки нет, но если есть ошибка (в rawExpressions выше есть wrongfield) Я хочу, чтобы он не фиксировал какую-либо часть выражений и не выполнял откат. Вместо этого он выполняет первые два выражения (создает таблицу и вставляет). Есть идеи, что не так?

1 Ответ

0 голосов
/ 21 февраля 2020

Это связано с тем, что DDL (язык определения данных) нельзя смешивать с DML (язык манипулирования данными) в транзакциях.

Операторы DDL и операции с нетранзакционными механизмами этого не делают " зарегистрироваться "в списках транзакций thd-> и, таким образом, не изменять состояние транзакции. Кроме того, каждый оператор DDL в MySQL начинается с неявной обычной фиксации транзакции (вызова end_active_trans ()) и, следовательно, не оставляет ничего для изменения. Однако, как отмечено выше для CREATE TABLE .. SELECT, некоторые операторы DDL могут начать новую транзакцию.

https://dev.mysql.com/doc/internals/en/transactions-notes-on-ddl-and-normal-transaction.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...