Мда... Этим бы вебмастерам, да увидеть раз в жизни Оперу (версия 6.04), ох... Ладно, у меня еще мысли появились...
Повторим: А можно ли установить read-only транзакцию? Или хотя бы настроить OCIDatabase на read-only?
PS: выложи исходники хелпа - там ведь столько лакун...
А теперь новое:
В общем мне надо переволдить прогу из-под record manager'a. Пока я в каждую таблицу тупо добавляю PK на sequnce'ах (получаю через sp, которая делает selecr seq.nextval from v$database ) Хорошо бы для этого поиметь событие OnAutoSetPK
Далее - я планирую для симуляции ISAM сделать 2 соединения: read-only read-commited с одной транзакцией на все время. И обычный read-write snapshot autocommit Тревожусь я, сможет ли detailquery от db2 использовать pk из списка полученного masterquery от db1 ? В идеале, даже db2 хорошо бы чтобы пускала чтение серез db1, а изменение через db2
Хорошо бы time-out на autocommit: т.е. если от посл. операции прошло например 0.1 секунд с большой вероятностью юзер сидит и читает. А если меньше - то с большой версией программа читает/пишет какие-то подчиненные данные. Можно типа псевдо-транзакций устроить. Особенно вместе с всплывающим окошком a la "громкость" - т.е. ползунок с кнопочкой "отключить"
PS: а пустить несколько транзакций через одно соединение на оракле возможно? м.б. я зря 2 db планирую - одной хватит?
1.Пиши по-английски - проблемы исчезнут 2.r/o транзакцию можно 3.Исходники хелпа - к Диману на мыло. Последнее время он редко читает форум 4.Выкинь свою процедуру и RTFM. Query.FieldByName('ID').DefaultExpression := 'NextVal(''MY_SQ'')' 5.На крайняк в afterinsert detail'а читаешь значение PK master'а.А вообще, ИМХО использовать 2 db в данном случае - это изврат 6.time-out на autocommit - к Диману 7.Я сам не пробовал, но вроде можно использовать параллельные транзакции с помощью TransactionManager Смотри демку TransMan Успехов!
2) как? 4) возможно, но так как я еще делаю Fib+/Yaffil то лучше все же иметь. Кроме того у меня опционально триггеры создаются. Если у меня здесь поле без PK вставится - я получаю ошибку и ищу таракана. А у клиента - втихаря заполняется триггером. Хотя м.б. Я не прав. 7) Гляну. Но будут ли это параллельные транзакции, т.е. одновременно активные? Хорошо, если да, поскольку вопрос 8: 8) мне тут уже по рогам дали, мрол ты по 2 соединения откроешь и у нас лицензии кончатся. Как Оракл 8i считает лицензии? По соединениям, машинам, юзерам? 5) откуда я его читать буду? М.б. ты и прав, но а вдруг? так она надежнее вроде. 2 соединения изврат, но запускать по 10 транзакций в секунду - тоже изврат. Вроде версионники этого не любят...
PS: если я Автора мылом попрошу глянуть на эту страничку, он откликнется? Или ему ее обязательно аттачем надо :-D
2.Вероятно TransactionManager.Transisolation:=tmReadOnly. Сам не пробовал, так что копай. 4.Не понял что ты имеешь ввиду. Генераторы и сиквенсы аналогичны. Другое дело что fib+ очень сильно отличается от NCOCI (у нас тоже есть опыт использования, но первым был оракл, а недавно жарптица). Вместо OnAutoSetPK используй AfterInsert и сам там смотри, надо заполнять PK или нет. 5.Чем проще, тем надежнее. 2 Db - вдвое сложнее. Я так и не понял, нафига это? Чтоб делать как в FIB+? Так это они не от хорошей жизни, а от уродства Interbase так сделали. Оракл - не "версионник". У него rollback-сегменты есть. Держи сколько хош открытых курсоров, делай коммиты - проблем не будет. Главное чтоб транзакции покороче были. При этом в момент commit ничего такого страшного не делается, все изменения в файлы вносятся во время DML, так что количество commit/сек особой роли не играет. 7. Вот ты и расскажи, как это будет. Очень интересно. 8.http://oradba.com.ru/misc/tips/license.shtml Если лицензии на процессор (что чаще), то количество коннектов ограничивается памятью и включенным/выключенным MTS. Каждый OCIDatabase.Connected := True - это 1 коннект. PS: у него как повезет - может вообще почту не читать, а может в тот же день все сделать и новую версию кинуть.
2) да, нашел уже. Просто кто же это ее обозвал Изоляцией? Изоляция - ээто Sanpshot, ReadCommited, DirtyRead... Кстати, ReadCommited в Оракле 8.1.7 есть?
4) в IB есть GEN_ID а в оракле надо select from v$database делать. а так - одна и та же СП. А если надо - я ее и их триггера вызову.
5) транзакции покороче - это интересно... Можно попробовать. Но если в таблице полтора миллиона записей? итого 6 мегабайт... Значит либо надо suspend на транзакцию делать. Либо пречитывать пропуская первые XXX записей. подумаю, что проще... Либо дочитвать отдельным потоком - в грид вытащили первые 30 ПК и детайлов по ним и в отдельном потоке остальное... Если б оно умело
9) я так понял, что TransactionManager поддерживает одну транзакцию? Т.е. сколько надо транзакция - столько и менеджеров заводить?
2. Про транзакции в оракл тута http://otn.oracle.com/doc/oracle8i_816/server.816/a76965/c15trans.htm#222 и тута http://technet.oracle.com/doc/oracle8i_816/server.816/a76989/ch4m2.htm#10880 И вообще там ответы на все вопросы 5.Покороче в смысле, если ты сделаешь DML, а потом долго-долго коммититься не будешь, может переполниться redo-buffer. Если транзакция для чтения (без for update) - то она никого не блокирует и может жить сколько хочешь. Не понял, ты хочешь полтора миллиона записей на клиента тащить? Нафига. Пользователь не в состоянии оценить более 150-300 записей. Надо менять идеологию приложения, чтоб больше этого количества не выкачивать за раз. Что такое suspend на транзакцию я не понял тоже. 9. Вероятно. Всегда было достаточно 1 транзакции, так что даже не задумывался над этим
Насчет множественных транзакций ... 1) Множественные транзакции в сессии возможны, если сессия будет работать в distributed режиме. В этом режиме есть несколько важных ограничений. Сейчас по памяти не вспомню ... Короче это не есть "штатный" режим ... 2) В каждый момент времени в сессии может быть только одна транзакция активной. Другие - должны спать ... 3) Множественные транзакции = глобальные транзакции. Т.е. ими владеет не сессия, а скорее всего сервер. Т.е. одна сессия может начать TX, потом усыпить ее, далее другая сессия может разбудить ее, и .т.д. 4) Используйте TOCITransactionManager только если это все вам надо TOCIDatabase имеет один менеджер встроенный и сама управляется с ним ... 5) Все это дело Ораклом тольком **не документировано**, поэтому если надо - экспериментируйте или спрашивайте в конфе про OCI на technet.oracle.com. 6) Множественные TX в Interbase и в Oracle это две очень большие разницы. См (1)-(3)
Надеюсь не испугал сильно.
Удачи, Дмитрий
PS: Исходники хелпа - пожалуйста, если надо. Если потом доработанный хелп выкладывать, то необходимо делать его на английском.
PS2: Со временем у меня на самом деле полный таймаут ...
M5) Длинную транзакцию я и имел ввиду как read-only. Менять идеология пока не возможно - это потом все переписывать будем. Сейчас надо эмулировать файлово-табличный доступ. Suspend - это ... спящая тарнзакция... В общем я прокачал 150-300 записей - и заснул. Сверху по тому же соединению другие транзакции запустились. Надо дочитать следующие 150-300 - разбудил, прочитал и пусть опять транзакция спит. Видимо это то что надо. Тем паче что 90% времени будут делаться отчеты где читать надо целиком таблицы!
D2) это наверное мне подойдет. И это не является множественным.. не штатным.. и т.д.? D4) если найду как в Оракле ReadCommited делать, то будет по 2 соединения. Одна будет вечнозеленой ReadOnly и читать будет PK с использованием where Row<150*N and Row>=150*(N-1) Если не найду - то будет от же самое, только у каждой таблицы для ПК будет своя транзакция, которая будет класться в Suspend. Хотя тут уже стращно - как бы их многовато не стало. Поля же будут читаться/меняться отдельной query которая будет детейлом к ПК-query. Через отдельное соединение короткими тразакциями. Если можно, чтобы мастер и детейл на разных соединениях висели, конечно. Хотя опять же - если бы можно было Select пускать через одно соединение, а изменения через другое.
Кстати, в чем у TransMgr TimeOut меряется? Секунды, миллисекунды?