Mysql Sequelize:在同一事务中使用truncate和insert
我需要截断我的一个表,然后跟随它,我需要通过bulkCreate使用新的数据收集重新填充它。所有这些都应该在一个事务中完成,我希望它能简单地工作,但我无法让它工作,有什么建议我如何在一个事务中对模型使用Mysql Sequelize:在同一事务中使用truncate和insert,mysql,node.js,sequelize.js,Mysql,Node.js,Sequelize.js,我需要截断我的一个表,然后跟随它,我需要通过bulkCreate使用新的数据收集重新填充它。所有这些都应该在一个事务中完成,我希望它能简单地工作,但我无法让它工作,有什么建议我如何在一个事务中对模型使用truncate,然后使用bulkCreate 这是我的一段代码 try { promises.push( models.sequelize.transaction(function (t) {
truncate
,然后使用bulkCreate
这是我的一段代码
try {
promises.push(
models.sequelize.transaction(function (t) {
return infx.destroy({
where: {},
truncate: true,
transaction: t
}).then(function () {
return infx.bulkCreate(dataCollection, {
transaction: t
});
});
}).then(function (result) {
// Transaction has been committed
}).catch(function (err) {
sendEmailOnError(err, 0, 0)
logger.error(err);
})
);
} catch (error) {
console.log("Input On End error", error);
logger.error(error);
}
return Promise.all(promises).then(() => {
doMoreThings().then(someData => {
console.log('Import complete! Shutting down process now.');
process.exit(0);
})
})
.catch((e) => {
// console.log("error", e);
logger.error(e);
});
使用async…wait重试,但事务仍不会回滚截断的数据
非托管事务
托管事务
Sequelize日志(事务中的所有内容都执行良好)
显然,这与: 尽管TRUNCATE TABLE类似于DELETE,但它被分类为DDL语句而不是DML语句
- 截断操作会导致隐式提交,因此无法回滚
result = await models.sequelize.transaction(
async (t) => {
//truncate table
await infx.destroy({
where: {},
transaction: t
});
//insert new bulk collection
return await infx.bulkCreate(dataCollection, {
transaction: t
});
});
} catch (error) {
logger.error(error);
}
try {
result = await models.sequelize.transaction(
async (t) => {
//truncate table
await infx.destroy({
where: {},
truncate: true,
transaction: t
});
//insert new bulk collection
return await infx.bulkCreate(dataCollection, {
transaction: t
});
});
} catch (error) {
console.log("Input On End error", error);
sendEmailOnError(error, 0, 0);
// logger.error(error);
}
Executing (8f53bd47-e324-48b7-8c7d-ea93dcbdae5c): START TRANSACTION;
Executing (8f53bd47-e324-48b7-8c7d-ea93dcbdae5c): TRUNCATE `infxes`
Executing (8f53bd47-e324-48b7-8c7d-ea93dcbdae5c): INSERT INTO `infxes` (...);
Executing (8f53bd47-e324-48b7-8c7d-ea93dcbdae5c): ROLLBACK;
result = await models.sequelize.transaction(
async (t) => {
//truncate table
await infx.destroy({
where: {},
transaction: t
});
//insert new bulk collection
return await infx.bulkCreate(dataCollection, {
transaction: t
});
});
} catch (error) {
logger.error(error);
}