Откат sequelize не работает при появлении новой ошибки - PullRequest
0 голосов
/ 03 марта 2020

Я пытаюсь обновить три таблицы за одну транзакцию. если одна из таблиц не обновляется, я хочу откатить ее. Я попытался вручную выполнить запросы в базе данных MySQL, и она отлично работает. Но в коде он не работает должным образом и не откатывается.

вот код,

return sequelize.transaction({
    autocommit: false
}, function(t) {
    return models.VaccinationCenter.update({
        email
    }, {
        where: {
            id: vacId
        }
    }, {
        transaction: t
    }).then(function(VaccinationCenter) {
        //console.log('---------------VaccinationCenter--------------------------------',VaccinationCenter)
        if (VaccinationCenter[0] === 0) {
            throw new Error();
            //console.log('VaccinationCenter--------------error')
        } else {
            return models.Person.update({
                    email
                }, {
                    where: {
                        email: prevEmail
                    }
                }, {
                    transaction: t
                })
                .then(function(Person) {
                    //console.log('---------------Person--------------------------------',Person);
                    if (Person[0] === 0) {
                        //console.log('Person--------------error');
                        throw new Error();
                    } else {
                        return models.User.update({
                                email
                            }, {
                                where: {
                                    email: prevEmail
                                }
                            }, {
                                transaction: t
                            })
                            .then(function(User) {
                                if (User[0] === 0) {
                                    //console.log('User--------------error');
                                    throw new Error();
                                } else {
                                    callback({
                                        statusCode: Constants.errorStatus.SUCCESS,
                                        body: {
                                            isValidemail: true
                                        }
                                    });
                                }
                                //console.log('---------------User--------------------------------',User)
                            });
                    }

                });
        }

    });

}).then(result => {
    callback({
        statusCode: Constants.errorStatus.SUCCESS,
        body: {
            isValidemail: true
        }
    });

}).catch(error => {
    callback({
        statusCode: Constants.errorStatus.BAD_REQUEST,
        body: {
            isValidEmail: false
        }
    });
});

Вот консоль при запуске этого кода.

Executing (f4d0d13f-d72e-4cb7-bd1b-c26e6ceddaca): START TRANSACTION;
Executing (f4d0d13f-d72e-4cb7-bd1b-c26e6ceddaca): SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;
Executing (f4d0d13f-d72e-4cb7-bd1b-c26e6ceddaca): SET autocommit = 0;
Executing (default): UPDATE `VaccinationCenters` SET `email`='devakadabare1+12@gmail.com',`updatedAt`='2020-03-03 10:06:14' WHERE `id` = 60
Executing (default): UPDATE `People` SET `email`='devakadabare1+12@gmail.com',`updatedAt`='2020-03-03 10:06:14' WHERE `email` = 'devakadabare1+11@gmail.com'
Executing (f4d0d13f-d72e-4cb7-bd1b-c26e6ceddaca): ROLLBACK;

1 Ответ

1 голос
/ 03 марта 2020

При использовании управляемой транзакции вы никогда не должны фиксировать или откатывать транзакцию вручную. Если все запросы выполнены успешно, но вы все еще хотите откатить транзакцию (например, из-за сбоя проверки), вы должны выдать ошибку, чтобы разорвать и отклонить цепочку. Например:

return sequelize.transaction(function (t) {
  return User.create({
    firstName: 'Abraham',
    lastName: 'Lincoln'
  }, {transaction: t}).then(function (user) {
    // Woops, the query was successful but we still want to roll back!
    throw new Error();
  });
});

Подробнее см. В документации

...