sp123 wrote:hren wrote:Для меня остается неясным, каким образом подобный уровень изоляции можно использовать с concurrent OLTP applications under heavy load - ведь он подразумевает пусть ограниченную, но блокировку по чтению. Если все это так, то Oracle и DB2 действительно сильно отличаются и приложения для них при портировании могут требовать существенной переделки.
Разрешите присоединиться к дискуссии. Предлагаю вместо отвлеченных рассуждений разобрать простейший пример. Есть некая таблица, над которой одновременно трудятся два типа приложений: front-end и back-end. Front-end вставляет/модифицирует записи - транзакций много, каждая из них короткая (update одну-две записи и тут же commit) и должна отрабатывать моментально - никакие задержки не допустимы, поскольку затрагивают конечного пользователя. Back-end тем временем раз в час делает всевозможные select'ы - формирует xml-и, рассылает alert'ы, отчеты, обычная рутина.
Вопрос к zVlad: нужно ли в DB2 делать что-либо, чтобы обеспечить отсутствие каких-либо блокировок со стороны back-end и, в то же время, непротиворечивость выдаваемых им select'ов, и если да, то как это выглядит на практике.
Спасибо !
In DB2 (as well as in any other truly blocking systems), there is just one way "обеспечить отсутствие каких-либо блокировок" - dirty read. In DB2 terminology Uncommited Read.
What you mean saying "непротиворечивость выдаваемых им select'ов"?
Unlike Oracle, DB2 makes referential and data control before actual data changes. Therefore, in case of DB2 UR you will see consistent (in terms of referential and data integrity) but (possibly) never committed. That’s all.
When you run Oracle, first, you have no way to see uncommitted data, even though you want to, second, with dirty read (I’m not sure if it is even possible) in Oracle you will (possibly) see inconsistent data in terms of referential and data integrity. Just due to fact that Oracle can make data inconsistent with UPDATE/INSERT and check those integrities (mostly) by the end of transactions (default). We discussed it a lot before. It was clear there.
I would add here now is that systems like RDBM likes a human body. Everything is related to each other and depends on. Choosing versioning means not just “readers don’t block writers” and vise versa, but also UNDO segments troubles and failures with serialized queries, which finally means, by the way, applications abends and lower level of concurrent access, and also mean that applications must be designed appropriately. We discussed it.
Do you think IBM just is not capable to implement versioning? No, not at all. Versioning was considered in IBM's structures as an approach to handle those issues long time ago, and was refused. I don’t know why.
It is impossible "обеспечить отсутствие каких-либо блокировок со стороны back-end и, в то же время, непротиворечивость выдаваемых им select'ов" unless you produce versions of data. But, be agreed, when Oracle creates undo segment for update it means that reader sees data which are already changed (I agree data are in consistent status. See above, with DB2 UR data are in consistent status too).