т.е. разницы что в одном опереаторе производить изменения, что во многих (т.е.
на каждую запись по отдельному оператору update) абсолютно нету?
не понял юмора... ты говоришь о двух транзакциях, сервер в этом случае
тупо смотрит была ли ситуация, что одна и та же запись изменялась (поле
ему пофиг, как и то было ли counter = 10 или counter = counter + 1).
Ответ положителен - отлуп.
хорошо, а является ли атомарным апдейт при изменении одной записи (тот же
вариант с увеличением счетчика). т.е. если в двух транзакциях начинается
одновременный update ... set counter = counter + 1, есть ли вероятность что в
обоих случаях прирощение будет происходить по отношению к одному значению (т.е.
в итоге общий прирост будет 1 а не 2) .
в двух транзакциях значение counter будет 1, поскольку каждая транзакция
видит версию записи до старта транзакции (repeatable read) или последнюю
закоммиченую запись. В обоих случаях counter = 0, поскольку у тебя ни
одна транзакция еще не коммитнулась.
ЗЫ. вопрос естественно имеет смысл только для WAIT транзакций (и даже скорее
NO_RECORD_VERSION WAIT)
ЗЗЫ. вот это вот http://www.ibase.ru/devinfo/norecver.htm читал, поэтому вопрос и возник.
rec_version и no_rec_version грубо говоря влияет на то, когда ты
получишь отлуп - сразу или через timeout. на результат транзакции это не
влияет.
если я правильно понял то, то что ты хочешь - это read-committed + wait
уровень изоляции, auto-commit режим (т.е. commit после каждого update-а)
и один update на запись. тогда если случится такое, что обе транзакции
пытаются изменить одну и ту же запись, то одна подождет, пока вторая
коммитнется, прочитает закомиченое значение, увеличит его на 1, запишет
и закомичет.