Выполнение транзакции блокирует строку для чтения на MariaDB - PullRequest
0 голосов
/ 25 апреля 2018

У меня возникли некоторые проблемы с уровнями ISOLATION и транзакцией, в которой возникла проблема состояния гонки.

У меня есть таблица с полем состояния, и n-процессы обращаются к нему.Каждая транзакция должна возвращать самую старую строку со статусом = 1 и менять статус на 2. Теоретически процесс 2 не должен иметь возможность получать один и тот же реестр.Но этого не происходит.Поскольку строка не заблокирована для чтения транзакцией.

Ниже вы можете найти псевдокод того, что будет делать транзакция:

  1. Начать транзакцию;
  2. Получить самую старую строку (порядок по дате создания) со статусом = 1;
  3. Обновить строку и установить статус = 2;
  4. Подтвердить транзакцию;

Состояние гонки происходит между 2 и 3. Поскольку строка не заблокированадля выбора.это возможно в MariaDB?Играя с уровнями изоляции?Сколько будет стоить это?

Ответы [ 2 ]

0 голосов
/ 19 мая 2018

Это может ускорить запрос, чтобы избежать блокировки:

INDEX(status, date_created) -- in this order.
0 голосов
/ 26 апреля 2018

Вы можете сделать все это одним оператором UPDATE, например,

 UPDATE table SET field=value,.., status=2
  WHERE status = 1
  ORDER BY date_created DESC
  LIMIT 1

Существует также ВЫБРАТЬ ДЛЯ ОБНОВЛЕНИЯ, если вам нужно что-то более изощренное.

...