Как сериализовать транзакции с несколькими запросами к базе данных, используя Sequelize? - PullRequest
1 голос
/ 26 апреля 2020

Мой сервер отслеживает игровые экземпляры. Если нет текущих игр, когда пользователь достигает определенной конечной точки, сервер создает новую. Если конечная точка будет нажата дважды, я хочу убедиться, что создана только одна новая игра. Я пытаюсь сделать это с помощью транзакций Sequelize:

const t = await sequelize.transaction({
    isolationLevel: Sequelize
        .Transaction
        .ISOLATION_LEVELS
        .SERIALIZABLE,
});
let game = await Game.findOne({
    status: {[Op.ne]: "COMPLETED"},
    transaction: t,
});
if(game) {
    // ...
} else {
    game = await Game.create({}, {
        transaction: t,                        
    });
    // ...
}
await t.commit();

К сожалению, когда эта конечная точка ударяется дважды, я получаю следующую ошибку: SequelizeDatabaseError: Deadlock found when trying to get lock; try restarting transaction.

I посмотрел на возможные решения здесь и здесь , и я понимаю, почему мой код выдает ошибку, но я не понимаю, как выполнить sh то, что я пытаюсь сделать ( или являются ли транзакции правильным инструментом для выполнения sh этого). Любое направление будет оценено!

...