Продолжайте транзакции с помощью хранимых процедур - PullRequest
0 голосов
/ 21 июня 2020

Я столкнулся со странной проблемой, с которой мне понадобится помощь.

Я использую транзакции в сценарии, когда я вставляю данные в несколько таблиц.

У меня есть сохраненный pro c в базе данных mysl, где происходит следующее:

шаг 1: INSERT INTO TABLE1 --- SUCCESS

step2: INSERT INTO TABLE2 --- SUCCESS

шаг 3 INSERT INTO TABLE3 --- FAILURE

Странная часть состоит в том, что откат происходит через sequlize только на TABLE3, а не на первых двух вставках.

код:

export const executor = async (query: Function, db: any) => {
  try {
    const result = await db.sequelize.transaction(async t => {
      const resp = await query(t);

      return resp;
    });

    // If the execution reaches this line, the transaction has been committed successfully
    // `result` is whatever was returned from the transaction callback (the `user`, in this case)
    return result;
  } catch (error) {
    // If the execution reaches this line, an error occurred.
    // The transaction has already been rolled back automatically by Sequelize!

    // log here

    console.log('ERROR', error);

    throw new Error('Internal server error');
  }
};

Я вызываю свой сохраненный pro c вот так:

const r = await executor(
  param =>
    db.sequelize.query(
      'CALL registerUser(:email, :password, :roleId, :firstName, :lastName, :age, :jobTitle, :prefLanguageId, :assigned, :expId, :imageId, :tableId, :position)',
      {
        replacements: {
          email: args.input.Email,
          password: PasswordHash,
          roleId: 1,
          firstName: args.input.FirstName,
          lastName: args.input.LastName,
          age: new Date(new Date(args.input.Age).toUTCString()),
          jobTitle: args.input.JobTitle,
          prefLanguageId: 1,
          assigned: false,
          expId: '9b42b3d0-b227-11ea-b63f-9746e0754cfe',
          imageId,
          tableId: null,
          position: null,
        },
      },
      { transaction: param }
    ),
  db
    );

Как я уже упоминал выше INSERT в одной из таблиц в сохраненном pro c не работает, и это намеренно, так как я тестировал, но я ожидал, что все данные, которые были вставлены во все таблицы, будут удалены при вызове отката.

Я неправильно об этом думаю? Я мог бы настроить транзакцию в самой pro c, но это как бы побеждает цель использования для нее sequelize.

1 Ответ

1 голос
/ 21 июня 2020

Вы передали объект с transaction prop в качестве третьего параметра, но вы должны передать его рядом с replacements prop во втором параметре:

db.sequelize.query(
      'CALL registerUser(:email, :password, :roleId, :firstName, :lastName, :age, :jobTitle, :prefLanguageId, :assigned, :expId, :imageId, :tableId, :position)',
      {
        replacements: {
          email: args.input.Email,
          password: PasswordHash,
          roleId: 1,
          firstName: args.input.FirstName,
          lastName: args.input.LastName,
          age: new Date(new Date(args.input.Age).toUTCString()),
          jobTitle: args.input.JobTitle,
          prefLanguageId: 1,
          assigned: false,
          expId: '9b42b3d0-b227-11ea-b63f-9746e0754cfe',
          imageId,
          tableId: null,
          position: null,
        },
        transaction: param
      })```
...