Использование SELECT ... FOR UPDATE для опроса об изменении значения - PullRequest
0 голосов
/ 25 февраля 2019

У меня есть таблица, которая содержит задачи и их статус, схожие с:

| task_id | task_status |
+---------+-------------+
|      71 |           1 |
|      85 |           3 |
|     110 |           2 |

Давайте назовем таблицу TASKS.

Состояние - это перечисляемое значение, например:

  1. = SCHEDULED
  2. = RUNNING
  3. = DONE

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

status = old_status
while(timeout_not_expired and status==old_status) {
    status = get_status("SELECT task_status FROM TASKS WHERE task_id=%1", task_id)
    wait(check_interval)
}
return status

Это неприятно, не только спамит сервер Oracle SQL, но и наш лог SQLзапросов.

Так что я немного погуглил и нашел около SELECT ... FOR UPDATE.Я попытался выполнить это утверждение:

SELECT 
task_status
FROM TASKS
WHERE task_id = 361
FOR UPDATE OF task_status

Но оно возвращается немедленно.Итак, вопрос:

  1. Это даже для чего FOR UPDATE?
  2. Если да, как мне заставить его ждать в очереди с таймаутом?

1 Ответ

0 голосов
/ 25 февраля 2019

Нет, это не то, для чего это предложение. Из документации :

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

Ваш запрос выбирает текущий статус для этой задачи и блокирует строку, в основном, исходя из предположения, что вы планируете обновить его, и не хотите, чтобы кто-либо другой мог изменить его междуваш select и последующие update.

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

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

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