Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Почему при выполнении пишет 'Transaction is active'? [D7, XP]


Fast2 ©   (2005-10-13 19:03:00) 

procedure TForm1.Button1Click(Sender: TObject);
var i:integer;
begin
if CanWriteToBD then begin //ф-ю CanWriteToBD  см ниже - она проверяет, есть ли запись в таблице
   IBTransaction1.StartTransaction;
   try
    IBQuery1.Close;
    IBQuery1.SQL.Clear;
    IBQuery1.SQL.Add('INSERT INTO CLIENT (name) VALUES
('+chr(39)+Edit1.Text+chr(39)+')');
    IBQuery1.ExecSQL;
    IBTransaction1.Commit;
   except
    IBTransaction1.Rollback;
   end;
end else ShowMessage('Клиент '+Edit1.text+' уже есть в базе данных!'); end;
        //ф-ция проверяет наличие клиента по введенному юзером  в Edit2 его (клиента) идентиф. коду
function TForm1.CanWriteToBD:boolean;
begin
 Result:=false;
 IBQuery2.Close;
 IBQuery2.SQL.Clear;
 IBQuery2.SQL.Add('SELECT ID FROM CLIENT WHERE ID=:P_ID');
 IBQuery2.ParamByName('P_ID').AsString:=Edit2.Text;
 IBQuery2.Open;
 if IBQuery2.RecordCount=0 then result:=true;
 IBQuery2.Close;
end;

Когда я не проверяю ф-цией наличие клиента (по его ID), то данные без проблем заносятся в базу. Но как только проверяю  функцией (CanWriteToBD), то выдает ошибку 'Transaction is active'.


Fast2   (2005-10-14 18:47:00) [1]

т.е., если я решил управлять транзакциями ЯВНО, то это надо делать абсолютно для всех "движений" по базе?


DiamondShark   (2005-10-14 18:36:00) [2]

ЛЮБОЙ запрос выполняется в контексте какой-либо транзакции, явной или неявной.
Никакой разницы между SELECT, UPDATE или DELETE нет.


Fast2   (2005-10-14 17:59:00) [3]

Спасибо за ответы <msguns ©   (14.10.05 15:30) [6] > и <Stakan ©   (14.10.05 15:17) [5] >

Прошу простить за глупый вопрос - я только начинаю разбираться с транзакциями. Но насколько я знаю, для SELECT не обязательно явно открывать транзакцию, в отличие от INSERT и UPDATE. Это не так?


msguns   (2005-10-14 15:30:00) [4]

>Fast2   (14.10.05 14:55) [3]
>IBQuery2 не  указывает ни на какую транзакцию (поле в свойствах IBQuery2.Transaction пустое) и все равно  - эта же ошибка.

А поле DataBase не пустое ? А если нет, то в TIBDataBase есть DefaultTransaction.
Очевидно, что если в Q2 нет явной ссылки на транзакцию, она использует ту, которая предполагается в коннекте по умолчанию, т.е. Transaction1.

Ни один запрос в ИБ не может быть выполнен вне транзакций. Если бв Q2 не ссылалась прямо или косвенно на какую-нибудь транзакцию, то IBX просто выдал бы соотв. сообщение.

>Ну хорошо, а какие могут быть варианты решения проблемы?

В ИБ можно работать с транзакциями двояко:
1. Неявно, используя механизм, заложенный в методах IBX. Как правило, это удовлетворит клиента, работающего по модели "удаленного" доступа, т.е. когда его изменения не становятся видны другим сразу же, и он сам не видит то, что меняется другими (хорош для однопользовательского варианта). В этом случае, как правило, все запросы "укладываются" в одну единственную транзакцию.

2. Явное управление, когда к приложению предъявляются повышенные требования по интерактивности вносимых изменений. В этом случае одной транзакцией, как правило, не обойдешься. Для правильной организации работы по этой технологии необходимо более детальное знание механизма транзакций, версионности данных и т.д. Т.е. надо читать.


Stakan   (2005-10-14 15:17:00) [5]

Fast2   (14.10.05 14:55) [3]
Запрос может выполняться только в рамках какой-либо транзакции. То есть у тебя IBQuery2 тоже выполняется в рамках транзакции IBTransaction1.
Поставь в код проверку
if not IBTransaction1.InTransaction then
 IBTransaction1.StartTransaction  


Digitman   (2005-10-14 15:15:00) [6]


> IBQuery2 не  указывает ни на какую транзакцию


а IBQuery1 на какую указывает ?

что за каша вообще ?

взялся явно управлять транзакциями ? так и управляй ими явно ! а не полагайся на дифолты в соотв.свойствах компонентов !


Fast2   (2005-10-14 14:55:00) [7]

IBQuery2 не  указывает ни на какую транзакцию (поле в свойствах IBQuery2.Transaction пустое) и все равно  - эта же ошибка.
Ну хорошо, а какие могут быть варианты решения проблемы?


msguns   (2005-10-14 13:41:00) [8]

Видимо, у тебя IBQuery2 указана в контексте той же транзакции, что и Query1

Когда ты просто выполняешь Q1, транзакция страртует и завершается. Стоит же тебе прдварительно запустить Q2, как он сам неявно запускает эту жетранзакцию и не завершаетее. После чего в основном коде у тебя следует попытка:

IBTransaction1.StartTransaction;


Fast2   (2005-10-13 19:37:00) [9]

никто не знает? Помогите, пож.


Наверх

Титульная страница Поиск, карта сайта Написать письмо