т.е. разницы что в одном опереаторе производить изменения, что во многих (т.е. 
на каждую запись по отдельному оператору 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, запишет и закомичет.

Reply via email to