Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Базы данных и репортинг > [AnyDAC] как организовать транзакции?


Автор: CompWorm 20.3.2010, 04:21
Доброго времени суток!
Вопрос у меня, как всегда, нубско-теоретический smile 

Для работы с MSSQL я юзаю http://www.remobjects.com/anydac.aspx
вопрос состоит в том, как правильнее/логичнее/грамотнее слинковать TADConnection, TADQuery и TADTransaction. 
например, если мы (без транзакций) связываем Connection с Query, то сделать это можно одним единственным способом:

1.0
Код

  ADQuery1.Connection       := ADConnection1;

тут всё просто и понятно. 

Однако Transaction можно подключить к Connection и так и сяк:
1.1
Код

  // 1.1.1
  ADConnection1.Transaction := ADTransaction1;
  // 1.1.2
  ADTransaction1.Connection := ADConnection1;


далее отмечу, что можно слинковать все три компонента разными способами:
2.1
Код

  ADConnection1.Transaction := ADTransaction1;
  ADQuery1.Connection       := ADConnection1;


2.2 
Код

  ADConnection1.Transaction := ADTransaction1;
  ADQuery1.Transaction      := ADTransaction1;


2.х
и так далее, все комбинации из
Код

  ADConnection1.Transaction := nil;
  ADQuery1.Connection         := nil;
  ADQuery1.Transaction         := nil;
  ADTransaction1.Connection := nil;


обращаю Ваше внимание на то, что соединения, типа 
Код

  ADQuery1.Connection:=ADConnection1;
  ADQuery1.Transaction:=ADTransaction1;

работать не будет, как и те, что написаны выше, что не совсем очевидно очевидно! 
для работы системы требуется, чтоб параметр Connection у нашего Transaction был не пустым!
то есть работают только комбинации, где присутствует строчка
Код

ADTransaction1.Connection := ADConnection1; 

а вот
Код

ADConnection1.Transaction := ADTransaction1;

с виду ни на что не влияет  smile 

вопрос: 
есть ли какой-то (не эстетический  smile ) смысл в разных вариантах связи этих объектов?
и если нет, то какой вариант классический?


Автор: CompWorm 22.3.2010, 20:25
хорошо, ставлю вопрос по-другому. а с другими компонентами вы как управляетесь в плане транзакций?

Автор: ZVano 15.4.2011, 17:58
Если тут проходит аналогия с IBX-транзакцией, то так:

Окружение:
ADConnection1 - центральный коннекшен
ADTransaction1 - транзакция по-умолчанию для ADConnection1

ADQuery1, ADQuery2 ... ADQueryN - рабочие запросы к БД.
ADTransaction2 - рабочая транзакция

Связи (обычная схема работы):
Код

ADConnection1.Transaction := ADTransaction1;
ADTransaction2.Connection := ADConnection1;

ADQuery1.Connection:=ADConnection1;
ADQuery1.Transaction := ADTransaction2;

ADQuery2.Connection:=ADConnection1;
ADQuery2.Transaction := ADTransaction2;
// ... 
ADQueryN.Connection:=ADConnection1;
ADQueryN.Transaction := ADTransaction2;


Отработали с ADQuery1, ADQuery2 ... ADQueryN делаем либо ADTransaction2.Commit, либо ADTransaction2.Rollback
В ADTransaction1 будут сидеть транзакции компонент(ADQueryX, ADTableX ...), не привязаных к определенной транзакции.
Т.е. ADTransaction1 - транзакция по умолчанию.



Кроме обычной схемы есть еще объединенная.
Это когда используется одна транзакция для нескольких подключений к разным БД.
Используется для того, чтобы выполнить одновременный гарантированый Commit|Rollback к разным БД.

Добавлено 20110418:
Проверил. Аналогия с компонентами IBX тут не проходит.
Все изменения идут мимо транзакции, которая указана в компоненнтах ADQueryN.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)