бд:
SELECT * FROM participants WHERE name = :name
Далее, при условии отсутствия такого участника, выполняется INSERT INTO ...
Т.к. данные операции не атомарны, это приводит к наличию race condition, который позволяет быстро отправив два последовательных запроса, зарегистрировать одного участника дважды. Псевдокод код воспроизведения такой баги:
let result1 = contestService.handleAddParticipantRequest(
new AddParticipantRequest('iddqd')
);
let result2 = contestService.handleAddParticipantRequest(
new AddParticipantRequest('iddqd')
);
let result1 = await voteResult1;
let result2 = await voteResult2;
expect(result1.isSuccess).to.be.true;
expect(result2.isSuccess).to.be.false;
Может ли кто-то рассказать об основных путях решения такой проблемы? Или может есть какое-то средство в языке/популярная либа для борьбы с этим?
Сделать name unique
Обсуждают сегодня