在事务中续订bulkCreate

时间:2017-09-06 16:26:28

标签: transactions sequelize.js

我尝试使用sequelize在事务中执行截断和批量创建。但是,批量创建永远不会执行。我的代码如下:

            sequelize.transaction(function(t) {
                return Item.destroy({ truncate: true, transaction: t }).then(() => {
                    return Item.bulkCreate(itemsArray, {transaction: t})
                })
            }).catch(function (err) {
                logger.error('ERROR:' + err);
            });

此日志如下:

5:21:23 PM - info: Successfully connected to DB:XXX
Executing (default): CREATE TABLE IF NOT EXISTS `items` (`barcode` 
VARCHAR(255) NOT NULL , `base` INTEGER, `original` INTEGER, `sale` INTEGER, 
`extraSale` INTEGER, `date` DATETIME, PRIMARY KEY (`barcode`)) ENGINE=InnoDB;
Executing (default): SHOW INDEX FROM `items`
Executing (83dc186e-dec7-4814-94fd-f05cebc0e48b): START TRANSACTION;
Executing (83dc186e-dec7-4814-94fd-f05cebc0e48b): TRUNCATE `items`
5:21:02 PM - info: here
Executing (83dc186e-dec7-4814-94fd-f05cebc0e48b): COMMIT;

如果我更改了函数以便我使用create,它将按预期工作。

任何想法为什么bulkCreate都没有工作?

1 个答案:

答案 0 :(得分:0)

原来以上是正确的。问题是由于代码的异步性质,我有一个清理函数,它会清空数组,为下一次迭代做好准备。此函数在bulkcreate之前触发,因此当items数组为空时,create不会触发。

更新后的解决方案如下。

            sequelize.transaction(function(t) {
                return Item.destroy({ truncate: true, transaction: t }).then(() => {
                    return Item.bulkCreate(itemsArray, { transaction: t }).then(() => {
                        //Ensure we are cleaned-up ready for the next iteration
                        //Have to clean up here due to async callback
                        itemsArray = [];
                    }, err => {
                        logger.error('ERROR:' + err);
                    })
                }, err => {
                    logger.error('ERROR:' + err);
                })
            }).catch(function (err) {
                logger.error('ERROR:' + err);
            });