sequelize transaction-保存要在下一个请求中提交的事务

sauutmhj  于 2021-09-23  发布在  Java
关注(0)|答案(1)|浏览(219)

我正在使用一个功能,将1000多个用户批量上传到数据库中。许多插入必须在不同的表中为每个用户完成
为了避免超时,我将上传csv文件分成200行的块,并将每个块发送到后端。
我的问题是:
如果我的数据有问题,并且没有被中间件捕获,应用程序就会崩溃。例如,如果它在第三个数据块中崩溃,那么前两个数据块中的所有数据都已插入到数据库中。
我需要一个全有或全无的方法。如果应用程序因某种原因崩溃,则不应在数据库中插入任何内容。
是否有一种方法可以保存或累积sequelize事务,直到最后一个区块完成,然后一次提交所有事务??
谢谢你的建议

bbuxkriu

bbuxkriu1#

您可以使用db事务。db事务不会导致超时(但如果您滥用它们,它们可能会导致死锁)
例如,您可以使用以下承诺:;

execInTransaction: function (pool) {
        return new Promise((resolve, reject) => {
            pool.getConnection(function (err, connection) {
                logger.debug("Connection opened " + connection.threadId);
                if (err) return reject(err);
                connection.beginTransaction(function (err1) {
                    if (err1) return reject(err1);

                    // Loop and insert 200 items at each time.. 

                    connection.commit(commitError => {
                        connection.release();
                        if (commitError != null) {
                            return reject(commitError);
                        }
                        return resolve("<some result>");
                    });
                }).catch(txnError => {
                    connection.rollback((rollbackError) => {
                        connection.release();
                        if (rollbackError != null) {
                            logger.error("Connection rollback failed. " + connection);
                            return reject(rollbackError);
                        } else {
                            return reject(txnError);
                        }
                    });
                });
            });
        });
    },

相关问题