У меня есть функция, которая в основном представляет собой простой формат verify if one can update the entry in the database > update the entry
При использовании парусов ORM (ватерлинии).
Проблема возникает, когда веб-интерфейс отправляет несколько запросов одновременно (или несколько запросов приходят сразу) в конечной точке API.В этот момент проверка указанных записей завершается неудачно, обновление записи означает, что другие изменения проверяются.
Я попытался решить эту проблему с помощью транзакций: как я понял, транзакции означают, что обновления хранилища данных препятствуют обновлению, в то время как другая транзакция все еще работает.занят?
Код:
const new_entry = await sails.getDatastore().transaction(async (db) => {
console.log(`${entry_id}: transaction started`);
if (section_name) {
const event_id: number = typeof entry.event === 'number' ? entry.event : entry.event.id;
section = await Section.findOne({
where: {
name: section_name,
event: event_id,
}
}).usingConnection(db);
if (!section) {
throw new BadParamsError('section not found');
}
console.log(`${entry_id}: before full check`);
const existing = await Entry.find({
event: event_id,
section: section.id,
}).usingConnection(db);
console.log(`${entry_id}: before updating items: ${existing.length}`);
//if existing is larger than free spots do something....
section_id = section.id;
console.log(`${entry_id}: start update`);
const new_entry = await Entry.update({id: entry_id}).set({
section: section_id
}).usingConnection(db).fetch();
const existing_after = await Entry.find({
event: event_id,
section: section.id,
}).usingConnection(db);
console.log(`${entry_id}: after updating items: ${existing_after.length}`);
console.log(`${entry_id}: transaction ended`);
return new_entry;
}
console.log(`${entry_id}: transaction ended`);
return {};
});
Однако, что я замечаю в журнале:
48: transaction started
48: before full check
47: transaction started
48: before updating items: 0
48: start update
47: before full check
47: before updating items: 0
47: start update
48: after updating items: 1
48: transaction ended
47: after updating items: 1
47: transaction ended
Это означает, что они оба обновляются одновременно, что еще хуже, они не видят обновления друг друга.
Как можно установить блокировки базы данных при обновлении?- Или иначе предотвратить такое состояние гонки?