![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Транзакция как бы глючит [D5, D7, MSSQL]
Fishka © (2004-04-09 10:25:00)Имеется запрос типа (ADOQuery, ADOConnection используется):
begin transaction T1;
declare ....
insert into A1 ....
if @@Error<>0 begin .... GOTO ERR_TR end
insert into A2 ....
if @@Error<>0 begin .... GOTO ERR_TR end
insert into A3 ....
...........................
if @@Error<>0 begin .... GOTO ERR_TR end
COMMIT TRANSACTION T1;');
ERR_TR: begin IF (@@TRANCOUNT > 0) ROLLBACK TRANSACTION T1;
BEGIN TRANSACTION T2;
update ....
COMMIT TRANSACTION T2;
end;
На форме есть AdoDataSet, поле которого отображается в DBRichEdit. Если два оператора случайно редактируют одновременно одну и ту же запись (DBRichEdit), то для второго оператора при попытке обработать эту запись (т.е. нажать кнопку, где идет приведенный выше запрос) выдается сообщение типа "запись была уже изменена" и далее невозможно даже уйти с данной записи, можно только закрыть форму. И при в таблицу А2 вносится запись, хотя в таблицу А1 запись не добавляется. И соответственно, нарушается целостность базы.
Вопрос: как избежать такой ситуации? Может быть, неверно установлены свойства используемых компонентов?
Fay (2004-04-09 16:33:00) [1]Попробуй так
begin transaction T1;
declare ....
insert into A1 ....
if @@Error<>0 begin .... GOTO ERR_TR end
insert into A2 ....
if @@Error<>0 begin .... GOTO ERR_TR end
insert into A3 ....
...........................
if @@Error<>0 GOTO ERR_TR
while @@trancount > 0 COMMIT TRANSACTION T1;
goto BuBuBu
ERR_TR: while (@@TRANCOUNT > 0) ROLLBACK TRANSACTION T1;
BuBuBu:BEGIN TRANSACTION T2;
update ....
COMMIT TRANSACTION T2;
end;
Johnmen (2004-04-09 16:28:00) [2]О, Господи... Да нет войн никаких. Просто интересовался твоим пониманием и не более того, почти...
:)
Delirium (2004-04-09 16:21:00) [3]"Это не недостаток" - согласен, согласен, ни каких религиозных войн - у MSSQL не преимущество перед IB, а расширение - совершенно согласен :)
Johnmen (2004-04-09 16:13:00) [4]>Delirium © (09.04.04 15:10) [30]
>важно одно - принцип: вся бизнес-логика в ХП. Вот и всё :)
С этим никто не спорил.
Еще раз подчеркну, что бизнес-логика к управлению тр-ми никакого отношения не имеет. А если имеет, то это уже не б.-л., а нечто более общее...
>если сервер БД не поддерживает управление транзакциями в ХП, то
>этот недостаток
Нет, не так. Это не недостаток, а то, что поддерживает - это расширение !
Nikolay M. (2004-04-09 16:02:00) [5]
> Хотя все-таки, непонятно, откуда берется та запись в таблице
> А2....
Start/Programs/MS SQL Server/Profiler не пробовал запускать? Помогает...
Delirium (2004-04-09 15:10:00) [6]Хм, ну на самом деле если сервер БД не поддерживает управление транзакциями в ХП, то этот недостаток легко компенсируется введением системы статусов, т.е. в каждую критичную таблицу добавляетя булево поле lLock и при работе все действия увязиваются с ним. Собственно можно реализовать кучу подходов с пользовательскими транзакциями и без, важно одно - принцип: вся бизнес-логика в ХП. Вот и всё :)
Johnmen (2004-04-09 14:30:00) [7]>откуда такой вывод?
Вывод из
1. управление транзакциями в ХП (IB)
2. несерьёзность ХП без управл.тр-ми
Delirium (2004-04-09 14:20:00) [8]"неужели ты считаешь, что, напр. для IB SQL сервера, нельзя написать серьёзную ХП ?" - откуда такой вывод?
Fay (2004-04-09 14:17:00) [9]
> Это сколько же TstringList-ов мне придется в них передать!
>
А почему бы, к примеру, не TServerSocket-ов?
Johnmen (2004-04-09 14:17:00) [10]Вот-вот, это уже выходит за рамки понятия ХП. Это уже нечто более "высокого" уровня.
>Практически в каждой серьёзной хранимой процедуре создаются и
>применяются транзакции
Опять же, если мы говорим о MSSQL, то так можно действовать, но это уже нечто большее, чем просто ХП, идеологически. И это обеспечивается расширенным механизмом, именно механизмом, функционирования ХП. (ура:) Биллу :))
Если мы говорим о SQL серверах вообще, то неужели ты считаешь, что, напр. для IB SQL сервера, нельзя написать серьёзную ХП ?
Fishka (2004-04-09 14:12:00) [11]Вернемся к нашим баранам.
Я не знаю, как будет выглядеть транзакция через хранимые процедуры. Это сколько же TstringList-ов мне придется в них передать!
Резюме: обработка ошибки на Post, возможно, поможет мне избежать ошибки при Insert.
Хотя все-таки, непонятно, откуда берется та запись в таблице А2....
Delirium (2004-04-09 14:09:00) [12]"Но причем же здесь транзакционный механизм ????????" - как это причём? Практически в каждой серьёзной хранимой процедуре создаются и применяются транзакции, причём от результатов работы транзакций могут меняться дальнейшие действия. Получается, что клиент просто может ничего не знать ни о каких транзакциях - его задача предеть параметры поцедуре и всё, а остальное - реализовал его "старший брат", некто - продвинутый, грамотно написавший процедуру и предусмотревший множество вариантов работы.
Fay (2004-04-09 14:01:00) [13]Ключевым полям скажите InKey
Johnmen (2004-04-09 13:53:00) [14]Всё это здорово, и никто с этим как бы не спорит.
Но причем же здесь транзакционный механизм ????????
Delirium (2004-04-09 13:36:00) [15]"что ты понимаешь под словом "процедура"" - под словом процедура применительно к базам данных, я понимаю исключительно хранимуюпроцедуру, как всегда и указываю. И в таком понимании поцедура действительно - "Отдельный самодостаточный целостный процесс", чем и хороша. Если мне требуется оформить какой-либо документ, у меня должна быть процедура модификации, которой в качестве параметров передаются данные, а результатом работы является модификация соответствующих справочников, вызов других процедур и т.п. в той последовательности и с тем уровнем целостности, какой требует бизнес-операция. Именно такой подход я и называю реализация бизнес логики на уровне хранимых процедур, если в БД все клиентские модификации осуществляются хранимыми процедурами, а запросы клиентов направлены исключительлно к представлениям - то такая БД на практике является чрезвычайно мастабируемой и не требует ни какого промежуточного слоя (сервера приложений). Для организаци малого и среднего бизнеса - идеальный вариант, существенно снижающий затраты на разработку корпоративного софта.
Johnmen (2004-04-09 13:16:00) [16]>Delirium © (09.04.04 12:49) [19]
>Что бизнес-правило овормленное в хранимую процедуру должно быть
>лишено транзакционности? Как ты это видишь?
Нет, не лишено. Но в контексте текущей тр-ии.
Бизнес-правила и тр-ии есть разные "сущности".
>А смысл работы процедуры основывается на нескольких
>транзакционно-разделённых процессах
Это некий особый "вид" процедуры, судя по всему. Или что ты понимаешь под словом "процедура" ? Отдельный самодостаточный целостный процесс ? Или же набор приемов, реализующих б.-логику, и не более ?
Лично для меня - это второе...
Delirium (2004-04-09 12:49:00) [17]> Johnmen © (09.04.04 12:11) [12]
"Я бы сказал, что это ("транзакционность туда"), подход в корне неверный, не зависимо от типа SQL сервера..." - т.е. что ты имеешь в виду? Что бизнес-правило овормленное в хранимую процедуру должно быть лишено транзакционности? Как ты это видишь?
Оборачивать саму прцедуру в транзакцию и анализировать результат? А смысл работы процедуры основывается на нескольких транзакционно-разделённых процессах, пикажете каждый отдельный процесс в свою процедуру оборачивать?
Nikolay M. (2004-04-09 12:39:00) [18]
> откуда появляется запись в таблице А2 запись, хотя в таблицу
> А1 запись не добавляется?
Это уже смотри свою логику, чудес не бывает. Может, у тебя на А2 триггер, который коцает А1, например.
> При Post-е, может и происходит ошибка и выдается сообщение
> о том, что запись была изменена.
Что и требовалось доказать...
Fishka (2004-04-09 12:34:00) [19]При Post-е, может и происходит ошибка и выдается сообщение о том, что запись была изменена. Но откуда появляется запись в таблице А2 запись, хотя в таблицу А1 запись не добавляется?
Nikolay M. (2004-04-09 12:26:00) [20]
> После того, как в DBRichEdit было отредактировано некоторое
> поле и нажата кнопка, происходит ADOQuery.Cancel или .Post
И не при Post-е ли происходит та самая ошибка?