Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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
1-3388
Cowboy
2002-08-22 11:29
2002.09.02
Определение диска.


7-3651
Nash
2002-06-20 11:33
2002.09.02
Диспетчер печати


1-3456
HemeC
2002-08-20 19:04
2002.09.02
ошибка Exception EDBEngineError............! и вопрос........!


14-3565
Guru-ru
2002-08-03 03:36
2002.09.02
Запуск программы на другом компе.


3-3273
Sergey-ZZZ
2002-08-12 15:13
2002.09.02
InterBase





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский