Качановский Дмитрий wrote:
примечание: кроме транзакций атомарным считается также и выполнение операторов. Например SELECT в режиме read committed видит только те записи, которые были committed другими транзакциями или изменены текущей на момент своего старта (т.е. execute). Последующие операции выборки записей (fetch) не будут видеть новые committed записи. Для того, чтобы их увидеть, нужно перевыполнить запрос.
Не-а. Принятие решения о видимости делается на момент посещения страницы данных, а не старта оператора в R_C. В снапшоте - тоже не старта оператора, а старта транзакции. Снапшот прочитает коммиченое на момент своего старта, R_C - на момент посещения. Соответственно, апдейт в снапшоте при попытке изменить изменённое (коммиченное, нет - по барабану) выдаст конфликт, R_C - только если некоммиченное на момент обращения к записи, а не своего старта. И вот тут и зарыта некоторая нелогичность R_C, который Аннушка зовёт bastardisation, но в текущей реализации она непреодолима, то есть преодолима, но уж очень через неё, родимую, замедлится всё неимоверно и бессмыссленно для большинства приложений. И, на мой вгляд, овчинка выделки не стоит, в смысле переделывать. Пользуй снапшот где нужна точность в конкурретности, r_c - для инкрементов, избегай массированных апдейтов путём проектирования, и твой кислотно-щелочной баланс...
правильно ли я понимаю, что независимо от параметра rec_version/no_rec_version я получу ВСЕ записи в том виде в каком они были на момент старта оператора.
Нет. No_rec_version прямо при чтении (изменённых некоммиченных записей) либо даст отлуп либо повиснет (wai/nowait) до коммита/роллбака. В случае роллбака будет читать дальше, в случае коммита как карта ляжет, если конкурировали 2 транзакции, прочитает новое, если больше - игра в рулетку. Ну а если коммичено на момент чтения - прочитает новое, без разницы rec/no_rec.
правильно ли я понимаю, что если пока я буду получать первые записи последние будут изменены в других тразакциях (которые к этому моменту еще не будут подтверждены/отменены) я получу выборку в полном объеме и без задержек (wait/no_wait)
В rec_version - да, он просто зачитает коммиченное. В no_rec_version - см.выше.
правильно ли я понимаю, что update, выбирая поштучно записи для модификации не гарантирует, что выборка будет получена в полном объеме и в том виде в каком они были на старте оператора при тех же параметрах тразакций что и раньше.
Бррр... Сам-то понял что спросил? :) Уровень изоляция, wait/nowait, коммичено/нет - разные ответы.
-- Regards. Ded.