Как приостановить транзакцию базы данных MySQL в NodeJS (expressJS)? - PullRequest
0 голосов
/ 11 февраля 2020

Итак, мне дали задание на кодирование, когда пользователь инициировал длинную транзакцию базы данных (скажем, обновление базы данных около 2 миллионов записей), но пользователь случайно обновил 20 миллионов записей (возможно, он взял все записи с января С 2017 по январь 2019, когда он должен был принимать записи с января 2018 по июнь 2018), поэтому пользователь инициировал транзакцию, которая занимает много времени в базе данных. Задача состоит в том, чтобы реализовать функцию, позволяющую пользователю приостанавливать, отменять или возобновлять обновление. Я вложил код, который у меня есть на данный момент, в мой сервер. js file.

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 */
}

Я использовал источники событий с именами 'pause', 'cancel' и 'resume' в конце REST API. точка, которая будет подниматься каждый раз, когда пользователь делает эти запросы. Я думаю, что отменить логи c довольно просто, так как там мне просто нужно откатить и закрыть соединение, но я борюсь с функцией паузы и возобновления. Как бы вы приостановили транзакцию базы данных? И затем также есть возможность возобновить с того места, где вы остановились?

PS: Есть ли более эффективные подходы для решения проблемы?

1 Ответ

0 голосов
/ 11 февраля 2020

Хотя я не уверен, что это лучший ответ, вы можете попробовать следующее:

  1. Отключить автокоммит
  2. Начать транзакцию
  3. Вместо запустив условное обновление с диапазоном дат, вы можете попробовать запустить обновление на основе идентификатора. Таким образом, вы можете отслеживать, какой элемент вы обновили, возможно, сохраняя их в списке
  4. Запросить у вашего сервера состояние вашей транзакции (выполняется, завершено и т. Д. c)
  5. Если вы Чтобы приостановить транзакцию, просто прекратите запуск обновления на некоторое время (возможно, с использованием логического флага)
  6. Если вы хотите прервать транзакцию, просто отправьте команду ROLLBACK
  7. Как только вы будете счастливы с вашей транзакцией, совершить его.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...