![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
TIBTransaction и MIDAS
Desperado © (2004-08-25 08:26:00)В хелпе про TIBTransaction есть такой интересный NOTE:
"In Midas applications, every query must be in its own transaction. You must use one transaction component for each query component."
Кто-нибудь знает, почему надо к каждому query прикреплять собственную транзакцию? Чем это вызвано?
Desdechado (2004-08-26 10:48:00) [1]Ну, одна или не одна, это от логики зависит, а не от количества датасетов.
Транзакция - это набор изменений, который должен выполниться целиком или не выполниться вовсе.
Desperado (2004-08-25 16:07:00) [2]Я уже так и буду делать.
Все изменения хранить в кеше, а потом одной секундной транзакцией
все залью в БД.
Правда кода перелопачивать уйму придется :(
Кстати, транзакция будет не одна. Несколько, но одновременно.
Т.к. Датасетов несколько.
Romkin (2004-08-25 14:30:00) [3]Ерунда: Смотри сам, там на сервере приложений открываются таблицы и висят. Транзакций нет. А когда все сделал - тогда все и идет в БД, в одной транзакции.
Desperado (2004-08-25 14:28:00) [4]Спасибо за совет.
Статья помогла.
Таких коротких транзакций, к сожалению не получится...
Логика приложения такая :)
Romkin (2004-08-25 11:09:00) [5]В общем случае, сервер приложений предназначен для общения с OLTP системами: ни одна из них не любит длительных транзакций. Поэтому стремиться надо к следующей схеме: открыли транзакцию, взяли или изменили быстро данные, и закрыли ее. Провайдер старается делать именно так.
Поэтому ставь на главную форму сервера TIBSQLMonitor и отслеживай транзакции и запросы. Во-первых, многое станет понятно, во-вторых, когда видишь открытие транзакции, проход данных и сразу hard commit - все в порядке, транзакция подтверждена.
Другой вопрос в том, что у Interbase 6.5 и выше и у Firebird транзакция read read_committed не нагружает сервер, и может быть открыта сколько угодно долго. В этом случае можно ставить у cds PacketRecords положительным, в остальных случаях я бы не рекомендовал, провайдер держит транзакцию до окончания фетча ;)
Romkin (2004-08-25 10:56:00) [6]Так ты МИДАС строишь?
http://rsdn.ru/article/db/midas.xml
Посмотри, как там сделано. Статья написана на D5, в IBX D6 у транзакции появилось свойство AutoStopAction, его обычно в saCommit надо ставить, все будет работать. И еще посмотреть примечание насчет TIBSQL ;)
Учитывать надо только одно: провайдер при общении с сервером открывает транзакцию, если она была закрыта. И если он ее открыл - то по окончании закрывает. Если открывал не он - она останется открытой :)
Desperado (2004-08-25 10:44:00) [7]Потому что мне намного удобнее использовать один компонент транзакции с несколькими query. Это существенно упрощает разработку. Но этот note в хэлпе меня немного пугает.
Romkin (2004-08-25 10:39:00) [8]Почему тебя это так волнует? :)
TIBTransaction предназначена именно для того, чтобы каждый блок работал в своей транзакции, практически это и написано.
Desperado (2004-08-25 10:18:00) [9]Есть еще варианты истолкования данного хелпа?
Romkin (2004-08-25 10:14:00) [10]По моему мнению, немного не точно: скорее, у каждого провайдера должна быть своя транзакция. И все TIBQuery этого провайдера цепляются к ней, а их модет ведь быть не одна, когда делается связка мастер-деталь.
Дело в том, что TDatasetProvider пытается сам управлять своими транзакциями.
Desperado (2004-08-25 09:53:00) [11]>пардон, спутал с прямым углом))
чего????
т.е. то что ты сказал не верно?
stud (2004-08-25 09:26:00) [12]пардон, спутал с прямым углом))
stud (2004-08-25 09:16:00) [13]не обязательно. главное чтобы компонент был привязан хотябы к одной транзакции. можно иметь один компонент транзакции для всех компонентов