1. "в оракле у меня все просто, пишем в таблицу payments и в той же транзакции обновляем поле balance. поскольку оракл версионный это не создает никаких проблем " - если остановиться на этом месте Вашей фразы, то можно вернуться в начало ее и заменить "оракл" на "дб2". Дальше Вы искусствено начинаете, в полном соответсвии с Оракл документацией, создавать иллюзию что кому могут быть часами интересны данные которые уже заведомо изменены. Кстати это можно сделать и в ДБ2, как с RC так и с UR. Результат во всех трех случаях будет примерно одинаков - неконсистентси, или неактуальность данных.iDesperado wrote:2zVlad
......
1. например у нас таблица accounts в нем поле balance, и таблица payments. в оракле у меня все просто, пишем в таблицу payments и в той же транзакции обновляем поле balance. поскольку оракл версионный это не создает никаких проблем любой читатель ради отчета может хоть несколько часов читать таблицу acounts не создавая проблем остальным. в db2 такой подход не приемлим, т.к. если читатель начнет читать таблицу accounts он не сможет получить консистентный отчет на уровне Read Commitedd, а более высокий уровень стопорнет пишушие транзакции, т.к. те буду ждать пока отчет с более высоким уровнем изоляции чем RC отпустит блокировки. в db2 я регулярно встречаю такой финт. вводится понятие закрытый период, асинхронный процесс, допустим раз в сутки "закрывает день" вычитывая payments поступившие за день и обновляет поле balance таблицы accounts. дальше что бы получить консистентный отчет на определенное время (на время Ч) читатель составляющий отчет читает на уровне RC balance и прибавляет к ним сумму payments за этот день зафиксированных до времени Ч. как видите оптимальные подходы db2 и оракла совершенно разные.
2. что плохо проэмулируется в оракле элементарно - оператор открывает окошко и db2 накладывает shared блокировку на запись (не дает изменить другим), не продумав последствия в оракле в лоб это можно проэмулировать SELECT FOR UPDATE, т.е. установкой эксклюзивной блокировкой, но тогда все открыватели должны открывать окошко последовательно.
Финт, который Вы регулярно встречаете в ДБ2 может быть не более чем постановочный момент. Так была поставленна задача. И в самом деле кому на хрен может быть нужен отчет на произвольный текущий момент если заранее известно что он устареет в следущее мгновение?
2. В этом фрагменте Вы используете не известную мне терминологию. В ДБ2 такого термина - окошко - нет. Может Вы имеете в виду курсор? Нужно ли обязательно эмулировать блокировку строки с уровнем изоляции RC c помощью SELECT FOR UPDATE я не могу сказать, это зависит от других обстоятельств, о которых Вы здесь не говорите, что вообщем то сами подтверждаете говоря "не продумав последствия в оракле". А продумав что Вы делаете в этом случае?