вот мой вопрос собсно об этом
каким образом выполняется update множества записей, какой из двух вариантов ближе?

вариант 1.
- читаем перву запись с подходящими условиями, изменяем
- читаем вторую, изменяем
- читаем третью, натыкаемся на то что другая транзакция ее изменила, ждем... ждем.. ждем...

этот.

вариант 2.
- читаем все записи предназначенные для изменения (WITH LOCK), натыкаемся на третьей, что она заблокирована, отменяем чтение, ждем, опять читаем и блокируем
- пишем изменения

я понимаю что record_version и no_record_version вносят свои коррективы в этап чтения, но в общем виде какой из вариантов ближе?

первый. второй тебе надо делать самому:

select some_field from some_table where id in (1, 2, 3) order by 1 with lock;

и потом

update some_table set counter = counter + 1 where id in (1, 2, 3);

ну, если есть желание, то можешь это в execute block объеденить. order by нужен для того, чтоб записи залочить, иначе они только во время фетча будут лочится и придется весь резалт-сет на клиента тянуть.

Роман

Ответить