Итак, мне дали задание на кодирование, когда пользователь инициировал длинную транзакцию базы данных (скажем, обновление базы данных около 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: Есть ли более эффективные подходы для решения проблемы?