簡體   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