Отправляет транзакции, не блокирующие запросы, пока транзакция занята? - PullRequest
0 голосов
/ 12 июня 2019

У меня есть функция, которая в основном представляет собой простой формат 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

Это означает, что они оба обновляются одновременно, что еще хуже, они не видят обновления друг друга.

Как можно установить блокировки базы данных при обновлении?- Или иначе предотвратить такое состояние гонки?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...