gpt4 book ai didi

mysql - 使用存储过程序列化事务

转载 作者:行者123 更新时间:2023-12-03 22:25:37 25 4
gpt4 key购买 nike

我面临一个奇怪的问题,我需要一些帮助。
我在将数据插入多个表的场景中使用事务。
我在 mysl 数据库中有一个存储过程,其中发生以下情况:

step 1: INSERT INTO TABLE1 --- SUCCESS

step2: INSERT INTO TABLE2 ---SUCCESS

step 3 INSERT INTO TABLE3 --- FAILURE


奇怪的是,当通过 sequelize 发生回滚时,它只发生在 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');
}
};
我这样称呼我的存储过程:
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 失败,这是自测试以来的设计,但我希望在调用回滚时所有已插入所有表的数据都将被删除。
我在想这个错误吗?我可以在 proc 本身中设置一个事务,但有点违背了使用 sequelize 的目的。

最佳答案

您传递了一个带有 transaction 属性的对象作为第三个参数,但您应该将它传递到第二个参数中的 replacements 属性旁边:

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
})```

关于mysql - 使用存储过程序列化事务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62491971/

25 4 0
文章推荐: node.js - Sequelize : is not associated to