繁体   English   中英

如何在 NodeJS (expressJS) 中暂停 MySQL 数据库事务?

[英]How to pause a MySQL database transaction in NodeJS (expressJS)?

所以我遇到了一个编码挑战,其中一个用户发起了一个长数据库事务(比如大约 200 万个条目的数据库更新),但是说用户不小心更新了 2000 万个条目(也许他从 2017 年 1 月到 1 月2019 年,当时他应该从 2018 年 1 月到 2018 年 6 月获取条目),因此用户发起了一个在数据库中花费大量时间的事务。 挑战在于实现一项功能以允许用户暂停、取消或恢复更新。 我已经在我的 server.js 文件中附加了我现在拥有的代码。

function getDataForDateRange(res, dateLowerBound, dateUpperBound, updateValue) {
    /* Begin transaction */
    connection.beginTransaction(function (err) {
        console.log('Transaction will begin...')
        if (err) {
            console.log('ERROR: ', err);
            throw err;
        }

        connection.query('UPDATE sakila.customer SET ? WHERE create_date >= ? AND create_date <= ?', [{ active: uVal }, dateLB, dateUB], function (err, result) {
            console.log('query started.');
            if (err) {
                connection.rollback(function () {
                    console.log('ERROR, database transaction rolled back.')
                    throw err;
                });
            }


            em.addListener('pause', function () {
                console.log('Event Listener pause request callback called.');
                // I want to wait until resume event happens

                // pause the database transaction here. How do I do that?

                em.addListener('resume', function () {
                    //connection.resume() --> find a function which can do this?
                    console.log('Connection resumed');
                });
                console.log('done waiting for resume button press');
            });

            //cancel event listener
            em.addListener('cancel', function () {
                connection.rollback(function () {
                    console.log('CANCELLED transaction upon user request');
                    console.log('transaction has been rolled back due to user cancelling transaction.');
                });
            });

            connection.commit(function(err) {
            if (err) {
                connection.rollback(function() {
                    throw err;
                });
            }
            console.log('successfully committed');
        });

        });
    });
    /* End transaction */
}

我在 REST API 端点中使用了名为“pause”、“cancel”和“resume”的事件发射器,每次用户发出这些请求时都会引发这些事件发射器。 我想取消逻辑非常简单,因为我只需要回滚并关闭连接,但我正在为暂停和恢复功能而苦苦挣扎。 您将如何暂停数据库事务? 然后还可以选择从暂停的地方恢复?

PS:有没有更好的方法来解决这个问题?

虽然我不确定这是最好的答案,但您可以尝试以下操作:

  1. 关闭自动提交
  2. 开始交易
  3. 您可以尝试根据 id 运行更新,而不是使用日期范围运行条件更新。 这样你就可以监控你更新的项目,也许将它们存储在一个列表中
  4. 查询您的服务器以了解您的交易状态(进行中、已完成等)
  5. 如果您想暂停事务,只需停止运行更新一段时间(可能使用布尔标志)
  6. 如果您想中止交易,只需发送 ROLLBACK 命令
  7. 一旦你对你的交易感到满意,就提交它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM