3

My server keeps track of game instances. If there are no ongoing games when a user hits a certain endpoint, the server creates a new one. If the endpoint is hit twice at the same time, I want to make sure only one new game is created. I'm attempting to do this via Sequelize's transactions:

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();

Unfortunately, when this endpoint is hit twice at the same time, I get the following error: SequelizeDatabaseError: Deadlock found when trying to get lock; try restarting transaction.

I looked at possible solutions here and here, and I understand why my code throws the error, but I don't understand how to accomplish what I'm trying to do (or whether transactions are the correct tool to accomplish it). Any direction would be appreciated!

trexinf14s
  • 261
  • 2
  • 13

0 Answers0