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