Идея состоит в том, что вы сначала выбрали бы запись (с помощью запроса select
), а затем решили обновить ее. Вы указали правильную процедуру. Требуется передать ему значение acc_version
в качестве последнего аргумента. У вас есть это значение из запрашиваемой вами записи.
Это тип контракта, которому вы должны следовать: вам нужно запросить этот acc_version
и затем передать его процедуре для обновления, которое вы хотите сделать. После каждого обновления вы должны повторно запрашивать текущее значение acc_version
, если вам все еще нужно сделать больше обновлений.
Поле app_version
должно быть числом (не датой). Он предназначен для отражения версии записи, такой как версия 1, 2, 3, ..., которая может рассматриваться как число обновлений, которые были сделаны для этой конкретной записи.
Процедура выполнит обновление при условии , что это значение в записи не обновлялось за среднее время (каким-либо другим обновлением). Для этой проверки используется простое предложение where
.
Если обновление ничего не обновляет, то это означает, что запись больше не удовлетворяет этому условию (и была изменена). В этом случае возникает исключение.
Но если acc_version
все еще остается таким же, как вы передали его процедуре, оператор update
действительно обновит целевую запись. В то же время оператор update
увеличивает acc_version
. Это не позволит другим клиентам, которые уже запросили эту запись до этого обновления, выполнять обновления. Им нужно будет повторно запросить запись, чтобы получить правильное значение acc_version
, и повторить попытку.