Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2005.11.06;
Скачать: [xml.tar.bz2];

Вниз

Почему при выполнении пишет 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.04 c
5-1106314196
STS
2005-01-21 16:29
2005.11.06
Регистрация ActiveX контрола


2-1128976228
Цукор5
2005-10-11 00:30
2005.11.06
TCanvas


2-1129104924
Gomez
2005-10-12 12:15
2005.11.06
Соотношение микронов и пикселей


1-1129200448
BFG9k
2005-10-13 14:47
2005.11.06
Dephi стирает {$IFDEF}


2-1129362612
Vital
2005-10-15 11:50
2005.11.06
Pисунок на форме





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский