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

Вниз

Ошибка   Найти похожие ветки 

 
Pavel_   (2002-08-10 08:08) [0]

Добрый день.
При работе программы временами, при обновлении или добавлении записей в БД выскакивют ошибки "No active transaction" или "No transaction is active". Закономерность выявить не удается.
Алгоритм программы линейный(т.е. последовательность select, insert, select...) На каждый insert открывается транзакция
Database1.StartTransaction, после чего и может выскакивать эта ошибка. Причем эта ошибка может появиться как при первом Insert, так и после 20-го.
Лечиться только через
ADOConnection.Active := false;
ADOConnection.Active := true;
Вопросы: 1). Из-за чего может появляться подобная ошибка?
2). Как от нее избавиться?
3). Каким образом можно перехватить это сообщение об ошибке (try...excepr не помогает)?

PS 2 update для ADO стоят. MSSQL2000.


 
Suntechnic ©   (2002-08-10 08:36) [1]

No active transaction обычно возникает не из-за начала транзакции, а из-за неправильного её завершения. Т.е. пытаешься вызвать Commit или Rollback, а транзакции и в помине нет никакой. Ты в своём вопросе упомянул про начало транзакции, но ничего не писал про её завершение. Скорее всего у тебя они просто в режиме AutoCommit проходят. Тогда вопрос: зачем вызываешь Database1.StartTransaction?

>На каждый insert открывается транзакция Database1.StartTransaction

Опять вопрос: зачем на каждый insert начинать транзакцию? Оператор insert представляет из себя неявную транзакцию. Он либо выполняется полностью и до конца, либо ничего не делает. А транзакции используют(обычно) когда необходимо выполнить несколько операторов insert, update, delete как единое целое.

Вообщем ты подумай над тем что я тебе тут написал и расскажи толком что там у тебя происходит, а потом уже будет видно, что ты делаешь не так.

И ещё. Это конечно дело вкуса, но если уж пошла такая пьянка, то я в своё время предпочитал использовать обычные T-SQL команды для старта, завершения и отката транзакций вместо методов Database.


 
Pavel_   (2002-08-10 09:17) [2]

Описываю подробнее.
Это самый сложный из запросов, который должен быть единым целым
try
AdoConnection1.BeginTrans;
insert ...
select @@identity...
АdoConnection1.CommitTrans;
except
AdoConnection1.RollbackTrans;
showmessage("...");
end;

Остальные запросы простые;
try
AdoConnection1.BeginTrans;
insert ...
АdoConnection1.CommitTrans;
except
AdoConnection1.RollbackTrans;
showmessage("...");
end;

Чаще всего ошибка выскакивает именно на запросе первого вида, но несколько раз было и при втором.
Все insert у меня оформлены именно таким образом, хотя на втором запросе можно было бы и без него обойтись.


 
Suntechnic ©   (2002-08-10 09:22) [3]

А чего ты хочешь добиться вставляя select в транзакцию? Что такого может сделать select что надо будет потом либо подтверждать либо откатывать?
И какие у тебя режимы транзакций установлены?


 
Pavel_   (2002-08-10 09:30) [4]

База многопользовательская.
С разных машин в нее могут добавлять карточки одновременно.
В таблице есть ключевое поле, являющееся уникальным. После вставки карточки последующим оператором Select @@identity я получаю уникальный номер этой, только что вставленной карточки для дальнейших операций.
Если Select вынести из транзакции, то есть ненулевая вероятность, что между инсерт и селект другой пользователь успеет вставить карточку, и поэтому последующим выбором select @@identity я получу номер совершенно другой карточки.
Режимы транзакций стоят по умолчанию. Курсор пробовал и серверный и локальный.


 
Suntechnic ©   (2002-08-10 09:49) [5]

>Режимы транзакций стоят по умолчанию
:) Класс. Наверное и я отвечу по умолчанию...

>Курсор пробовал и серверный и локальный.
Это какой такой локальный курсор? Где ты его взять умудрился?


 
Pavel_   (2002-08-10 09:55) [6]

Я имел ввиду параметры компонента TADOConnection.
CursorLocation - clUseClient
IsolationLevel - ilCursorStability

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


 
Suntechnic ©   (2002-08-10 10:14) [7]

>Никаких специальных дополнительных параметров самой транзакции я не устанавливал.

Это конечно очень весело, но какие параметры у тебя стоят по умолчания? Я если даже ник сменю на Нострадамуса, всё равно не догадаюсь :)

Интересуют в первую очередь режим AUTOCOMMIT ON или OFF и ISOLATION LEVEL. Я тебе ещё в первом посте об этом говорил. Если у тебя стоит AUTOCOMMIT ON то тогда каждая SQL команда отправляемая на сервер завершается COMMIT. И когда ты потом второй раз пытаешься вызвать АdoConnection1.CommitTrans она тебе просто говорит что активных транзакций нет.


 
Pavel_   (2002-08-10 10:28) [8]

>Это конечно очень весело, но какие параметры у тебя стоят по
>умолчания? Я если даже ник сменю на Нострадамуса, всё равно не
>догадаюсь :)
:)
Я понял. Но сейчас посмотреть параметры не могу, только в начале недели.
Но ведь даже если б стоял AUTOCOMMIT ON, то ошибка выскакивала бы после каждой транзакции. А тут может 20 раз сработать, а на 21-й выскочить.
И еще. Эти ошибки - "No active transaction"
и "No transaction is active" - это одно и тоже или это две разных? Первая выскакивала на обычном инсерте, вторая на сложном.




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

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

Наверх




Память: 0.49 MB
Время: 0.015 c
1-3371
EugenCFG
2002-08-20 11:11
2002.09.02
Как создать процедуру на кнопку, которой ещё нет....


14-3614
Igorek
2002-08-07 09:56
2002.09.02
Две задачки про взвешивание


1-3430
GIL
2002-08-22 05:26
2002.09.02
Только для умных!!!


1-3330
Beglec
2002-08-21 17:26
2002.09.02
Как в NT заставить показнуть монитор и включиться снова.


1-3340
EugenCFG
2002-08-21 18:39
2002.09.02
В чём ошибка??? Подскажите ПЖ!