sp123 wrote:zVlad wrote:Вопрос к Sp123: в Вашем конкретном back-end, или это возможно (согласно предикатам в SELECT-ах) прикосаться к данным, которые могут быть предметом модификации front-end-ом?
Или это два непересекающихся ЛОГИЧЕСКИ сегмента данных?
Sp123 wrote:
"Если под словом "данные" понимать rows, то пересечения - сплошь и рядом. К примеру, есть в таблице поля A и B. Изначально записи создаются на front-end со значением B = 'CREATED', в дальнейшем front-end это поле не меняет, зато все время очень активно модифицирует поле A и страшно злится, если что-то "зависло". Раз в полчаса некая back-end программа (назовем ее "авторизация") должна выбрать все записи с B = 'CREATED', поменять значение на 'PENDING', поманипулировать со всякого рода датой, может быть даже файлы какие-нибудь туда-сюда погонять по ftp, после чего обновить значение B на 'SUCCESS' или 'FAIL'. При этом никакие долгие блокировки не допустимы, за select for update бьют канделябром. Кроме этого есть еще одно приложение (назовем его "караул"), которое раз в день выбирает записи в соcтоянии 'PENDING-дольше-трех-дней-по-состоянию-на-9:00pm' и отсылает злобный e-mail заинтересованным начальникам для разбора полетов. После чего кто-нибудь начинает активно придумывать и гонять select'ы и искать виновных. Итого имеем как минимум два запроса, для которых uncommited read не годится:
- "авторизация" не должна видеть записи c В = 'CREATED', для которых еще не было commit, потому как front-end может их rollback, а поезд уже ушел
- "караул" хочет видеть точный снимок состояния таблицы на 9 утра безо всяких там dirty
... и одного дятла, который стучит по кнопкам, будучи в состоянии стресса (ему, мы, конечно, строго накажем использовать только uncommited read, но кто его, дурака, знает).
О чем нужно позаботиться разработчику под Oracle для того, чтобы не подвесить front-end? Поскольку единственное место, где блокировка может произойти - это update в программе "авторизация", будем делать этот самый update по ROWID и немедленно COMMIT после каждой записи. Поскольку front-end по определению тоже длинными транзакциями не грешит, все довольны и никто никому не мешает."
Теперь мы решили переехать на DB2... Как много изменений нужно будет внести в это простейшее приложение? Думается, это будет уже совсем другое приложение. И виноват в этом, конечно же, Oracle, который не следует стандарту SQL92.
PS. Хорошо, когда выходной. Всякую лабуду можно сочинять
[/quote]"
Конец цитаты
Прежде всего. То что Вы описали - это результат "творческого" осмысления неким первичным девелопером бизнес-задачи. Если заниматься этим прикладом всерьез то нужно было бы вникнуть в то а почему это так нужно? Подвергнуть принятые ранее проектные решения критики с точки зрения желательного механизма конкурентного доступаю И я Вас уверяю хорошее решение будет найдено и в случае DB2. Такое переосмысление было бы не вредно в любом случае. Чутье мне подсказывает - то что Вы описали - выражение заблуждения относительно бизнес требований.
Несколько конкретных вопросов:
"....При этом никакие долгие блокировки не допустимы, за select for update бьют канделябром. ..." - я так понимаю это что принята практика когда сначала делается просто SELECT, а затем UPDATE with ROWID. Так? Что если между SELECT и UPDATE произошло обновление выбранных записей? Ведь блокировать то их нельзя.
"...Кроме этого есть еще одно приложение (назовем его "караул"), которое раз в день выбирает записи в соcтоянии 'PENDING-дольше-трех-дней-по-состоянию-на-9:00pm.... " - почему здесь "dirty read" то не годиться? А как вообще "PENDING" может дольше трех дней висеть если "..."авторизация") должна выбрать все записи с B = 'CREATED', поменять значение на 'PENDING', ......, после чего обновить значение B на 'SUCCESS' или 'FAIL'"?
"О чем нужно позаботиться разработчику под Oracle для того, чтобы не подвесить front-end? Поскольку единственное место, где блокировка может произойти - это update в программе "авторизация", будем делать этот самый update по ROWID и немедленно COMMIT после каждой записи." - В DB2 это было бы:
Isolation level CS, and
OPEN CURSOR C52 ... WITH HOLD
DO FOREVER
FETCH C52 INTO ......
COMMIT
END