Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/42.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql Sequelize:在同一事务中使用truncate和insert_Mysql_Node.js_Sequelize.js - Fatal编程技术网

Mysql Sequelize:在同一事务中使用truncate和insert

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) {

我需要截断我的一个表,然后跟随它,我需要通过bulkCreate使用新的数据收集重新填充它。所有这些都应该在一个事务中完成,我希望它能简单地工作,但我无法让它工作,有什么建议我如何在一个事务中对模型使用
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语句

  • 截断操作会导致隐式提交,因此无法回滚
参考文献:

对于我的场景,我可以选择使用delete而不是truncate:

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