Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.11.06;
Скачать: CL | DM;

Вниз

Почему при выполнении пишет Transaction is active ?   Найти похожие ветки 

 
Fast2   (2005-10-13 19:03) [0]

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-13 19:37) [1]

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


 
msguns ©   (2005-10-14 13:41) [2]

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

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

IBTransaction1.StartTransaction;


 
Fast2   (2005-10-14 14:55) [3]

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


 
Digitman ©   (2005-10-14 15:15) [4]


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


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

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

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


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

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


 
msguns ©   (2005-10-14 15:30) [6]

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

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

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

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

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

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


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

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

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


 
DiamondShark ©   (2005-10-14 18:36) [8]

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


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

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



Страницы: 1 вся ветка

Текущий архив: 2005.11.06;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.044 c
14-1129719369
Иг_Иг
2005-10-19 14:56
2005.11.06
Свернуть все окна !


14-1129636023
Stranger53
2005-10-18 15:47
2005.11.06
Новые версии Delphi


1-1129137427
Rianon
2005-10-12 21:17
2005.11.06
Проблема с Dll и формами


14-1129120340
MacroDenS
2005-10-12 16:32
2005.11.06
Стабилизированные 12 вольт


1-1129551717
Bagdat
2005-10-17 16:21
2005.11.06
Маска в StringGrid