Одна активная транзакция IB за все время существования одного пользовательского приложения

Есть ли какие-либо негативные последствия, когда одно пользовательское приложение использует только одну транзакцию ИБ, которая активна, пока работает программа? Используя только CommitRetaining и RollbackRetaining.

Предыстория: я хочу использовать IBQuery и подключить их к сетке БД (DevExpress), которая загружает все записи в память сразу. Поэтому я хочу избежать повторной выборки всех данных после каждой команды вставки SQL. IBTransaction.Commit закроет набор данных.


person markus_ja    schedule 21.01.2010    source источник


Ответы (2)


Мне кажется, что вы пытаетесь использовать функцию базы данных, чтобы избежать использования TClientDataSet, что явно является предпочтительным способом работы в Delphi в наши дни. Зачем стараться изо всех сил и использовать сомнительные методы транзакций вместо того, чтобы следовать более распространенному шаблону использования компонентов базы данных, который уже является лучшим решением существующей проблемы?

person Craig Stuntz    schedule 21.01.2010
comment
Вы в чём-то правы :) Я уже давно думаю, куда мне идти. Используя напрямую TIBQuery или TClientDataset. В IBQuery есть несколько приятных функций времени разработки (например, SQLUpdate), которые явно упрощают разработку RAD. У меня также есть некоторые опасения, может ли дополнительный слой создать больше проблем, усложнить разработку и снизить производительность. На самом деле, я не уверен, что лучше подходит для одного пользовательского приложения. У вас есть какие-то ориентиры? - person markus_ja; 21.01.2010
comment
Нет сомнений, что, по крайней мере на поверхностном уровне, использовать TClientDataSet сложнее, чем не использовать его. Однако, как только вы научитесь его использовать, вы сможете использовать эти навыки для решения широкого круга проблем, которые вы не сможете решить без него (или без какого-либо другого компонента, который делает то, что он делает). Я использую TClientDataSet для каждого приложения базы данных Delphi, которое я пишу, включая мои бесплатные инструменты анализа производительности IB. - person Craig Stuntz; 21.01.2010

CommitRetaining и RollbackRetaining не годятся.

транзакция должна быть очень короткой.

person Hugues Van Landeghem    schedule 21.01.2010
comment
Не могли бы вы уточнить, пожалуйста? Чем плохи методы XRetaining? Почему транзакции должны быть короткими? Насколько короткими они должны быть? - person Rob Kennedy; 21.01.2010
comment
Это было верно для архаичных версий IB, но не для текущих версий, если вы не используете изоляцию моментальных снимков. Роб, если вы используете изоляцию моментальных снимков, то сервер должен хранить старые версии записей, что не позволяет сборщику мусора сервера IB работать, а это означает, что каждый SELECT должен просматривать множество версий записей, чтобы найти ту, которая видна. к транзакции пользователя. Это верно, даже если текущая транзакция не является моментальным снимком. В старых версиях IB даже не моментальные транзакции мешали сборке мусора. Это было исправлено много лет назад - person Craig Stuntz; 21.01.2010
comment
@Craig: Вы знаете, верно ли это и для firebird? - person jachguate; 22.01.2010
comment
Без понятия; Извините. IIRC это было исправлено в IB 7 или 7.1. - person Craig Stuntz; 22.01.2010
comment
Если вы используете Firebird, я советую вам не использовать эту функцию. - person Hugues Van Landeghem; 22.01.2010
comment
@Hugues: Можете ли вы объяснить, почему? - person markus_ja; 25.01.2010