Форум: "Базы";
Текущий архив: 2002.09.02;
Скачать: [xml.tar.bz2];
ВнизОшибка Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.084 c