SQL: обновить строку, если выполняется условие для других строк, в параллельной ситуации - PullRequest
0 голосов
/ 28 мая 2018

Я работаю над приложением в параллельной ситуации, когда несколько экземпляров приложения одновременно обновляют строки в базе данных.Каждый экземпляр приложения создает событие обновления в таблице событий обновления, событие обновления может иметь статус IN_PROGRESS / NEW / CANCELED.Я хочу создать запрос на обновление события обновления, если:

  • нет события обновления для того же элемента с идентификатором состояния = IN_PROGRESS
  • нет события обновления для того же элемента с идентификатором состояния = новогои метка времени> текущая метка времени события обновления.

Таблица:

UpdateId | itemId | status      | time_stamp
1        | 1      | IN_PROGRESS | 1.1
2        | 1      | NEW         | 1.2
3        | 1      | NEW         | 1.3
4        | 1      | NEW         | 1.4

С обновлениями 1, 2, 3, 4, как указано выше, в основном я хочу, чтобы 2 подождал, пока не будет сделано 1, если приходят 3, 4, то 2 -> отменяется.То же самое для 3.

Что-то вроде:

Update UPDATE_EVENT SET status = IN_PROGRESS IF {
SELECT count (*) FROM UPDATE_EVENT where status=IN_PROGRESS & itemId=item1 = 0
  && 
 SELECT count (*) FROM UPDATE_EVENT where status=NEW & timestamp > updateId_abc123.timestamp = 0
} WHERE updateId=abc123

Обновления не очень часты, также задержка не является проблемой.Любые идеи о том, как я могу построить запрос и является ли он потокобезопасным?

1 Ответ

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

Основной вопрос - как часто и какие требования к производительности предъявляются к этому процессу.Есть быстрый путь и очень длинный путь.

Очень долгий путь потребует использования упорядоченного / однопоточного процессора, который будет принимать запросы и ставить их в очередь.Используйте потоковый процессор и другие идеи для управления этими запросами.Использование потокового процессора очень хорошо масштабируется, если у вас есть большое количество обновлений во время показа.

Для небольших приложений можно проверить уровень изоляции параллелизма.Параллелизм использует некоторый механизм блокировки, чтобы гарантировать, что первый, кто запустит транзакцию, завершит ее, и только после этого другой экземпляр сможет внести свои изменения.

Оба не являются быстрыми решениями и потребуют от вас немного прочитать о них.Как установить уровень изоляции на вашем SGBD, в коде приложения и т. Д.

...