Форум: "Базы";
Текущий архив: 2007.04.29;
Скачать: [xml.tar.bz2];
ВнизТранзакции в хранимках Найти похожие ветки
← →
Ёжик из тумана (2007-02-01 20:29) [0]Я Вам ещё не надоел?
Тогда Приветствую
У меня в хранимке есть несколько инсертов и вложенная процедура. Так вот всю эту кухню запускать в рамках одной транзакции или на каждое действие по отдельности? Если последнее, то откат будет более длинным (в смысле кода). А откатывать надо целиком всю хранимку. Можно, конечно, с клиента, но зачем лишний траффик гонять?
← →
Виталий Панасенко © (2007-02-01 20:31) [1]
> Ёжик из тумана (01.02.07 20:29)
выйди, наконец то.....
← →
DrPass © (2007-02-02 00:56) [2]
> Так вот всю эту кухню запускать в рамках одной транзакции
> или на каждое действие по отдельности?
Если ты задаешь такие вопросы - то зачем тебе там вообще транзакции. Включи в драйвере автокоммит и забудь про них. Все равно будет лучше работать, чем с такими идейками
← →
Sergey13 © (2007-02-02 08:11) [3]> [0] Ёжик из тумана (01.02.07 20:29)
В ХП вообще не стоит управлять транзакциями. Это прерогатива клиента.
← →
Sergey13 © (2007-02-02 08:55) [4]> [3] Sergey13 © (02.02.07 08:11)
Подумал, и решил немного исправить.
В ХП, запускаемых с клиента, вообще не стоит управлять транзакциями. Это прерогатива самого клиента.
← →
Ega23 © (2007-02-02 08:56) [5]Просле каждого шага на ошибку проверять надо.
← →
Gin2 (2007-02-02 10:42) [6]
> Sergey13 © (02.02.07 08:55) [4]
что значит клиент? если запущу на сервере в QA это клиент?
А вообще нужно или нет, надо смотерть ХП в базе master - там Мягкотелые сами все сказали.
← →
logic (2007-02-02 10:52) [7]
> Sergey13 © (02.02.07 08:55) [4]
В принципе - одно другому не мешает.
← →
evvcom © (2007-02-02 10:53) [8]> [6] Gin2 (02.02.07 10:42)
> если запущу на сервере в QA это клиент?
Ну уж точно QA не сервер. Ты знаешь какое-то третье понятие, неизвестное нам?
← →
Sergey13 © (2007-02-02 10:57) [9]> [7] logic (02.02.07 10:52)
Оно не мешает. Но вот если, как у автора, ынутри одной процы вызывается другая, то если во внутренней будет commit стоять, то вполне можно получить удивление от работы.
← →
evvcom © (2007-02-02 11:00) [10]> [4] Sergey13 © (02.02.07 08:55)
Наверное, даже еще точнее будет, если сказать "в ХП, выполняющейся в контексте той же транзакции, которая была инициирована клиентом" :o)
> [7] logic (02.02.07 10:52)
ИМХО, мешает, с учетом вышеизложенного замечания. Клиент (юзер) должен сам решать, коммитить ему ту лабуду, которую он ввел, или это он баловался или чего-то там прикидывал.
← →
logic (2007-02-02 11:09) [11]
> Sergey13 © (02.02.07 10:57) [9]
Ну вообще-то MSSQL поддерживает вложенные транзакции.
Конечно всегда есть ньюансы, можно почитать тут
http://support.microsoft.com/kb/177138/EN-US/
и тут
http://support.microsoft.com/default.aspx?scid=kb;en-us;198024
Тут все от "рук" разработчика зависит. :)
← →
Sergey13 © (2007-02-02 11:22) [12]> [10] evvcom © (02.02.07 11:00)
В принципе да, это конечная цель. Но одна и та-же ХП может запускаться как отдельно, так и в составе некоего пакета команд, в зависимости от задачи. И тот и другой вариант требует обрамления транзакцией.
Тогда наверное надо сформулировать так. Управление транзакциями должно осуществляться в том же месте программы, где инициализируется начало транзакции.
← →
Sergey13 © (2007-02-02 11:23) [13]> [11] logic (02.02.07 11:09)
Это немного не то.
← →
Ega23 © (2007-02-02 11:26) [14]Ну вот пример транзакции в хп:
if @ActNam="CLASSES.DEL"
begin
BEGIN TRANSACTION TranClassDel;
-- Сначала удалим ClassFields
exec S_ClassSystem @ActNam="ClassFields.Del", @CLSID=@CLSID, @SelOut=0;
if @@Error<>0 GoTo ClassesDelRollbackTran;
-- Теперь удалим ClassMethods
exec S_ClassSystem @ActNam="ClassMethods.DEL", @CLSID=@CLSID, @SelOut=0;
if @@Error<>0 GoTo ClassesDelRollbackTran;
-- Удаляем ClassStates
exec S_ClassSystem @ActNam="ClassStates.DEL", @CLSID=@CLSID, @SelOut=0;
if @@Error<>0 GoTo ClassesDelRollbackTran;
-- Удаляем ClassEvents
exec S_ClassSystem @ActNam="ClassEvents.DEL", @CLSID=@CLSID, @SelOut=0;
if @@Error<>0 GoTo ClassesDelRollbackTran;
-- А теперь и сами Classes
Delete Classes where CLSID=@CLSID;
if @@Error<>0 GoTo ClassesDelRollbackTran;
Select @Result=@CLSID;
ClassesDelCommitTran:
begin
if @Debug<>0 print("COMMIT TRANSACTION");
COMMIT TRANSACTION TranClassDel;
if @SelOut=1
begin
Set NoCount OFF;
Select Result=@Result;
end;
Goto Fin;
end;
ClassesDelRollbackTran:
begin
if @Debug<>0 print("ROLLBACK TRANSACTION");
ROLLBACK TRANSACTION TranClassDel;
RaisError("CLASSES.DEL> ",16,1);
Return(-1);
end;
Goto Fin;
end;
← →
evvcom © (2007-02-02 11:32) [15]> [12] Sergey13 © (02.02.07 11:22)
Согласен. Так еще точнее будет :o)
← →
Bless © (2007-02-02 12:54) [16]
> Sergey13 © (02.02.07 10:57) [9]
>
> > [7] logic (02.02.07 10:52)
>
> Оно не мешает. Но вот если, как у автора, ынутри одной процы
> вызывается другая, то если во внутренней будет commit стоять,
> то вполне можно получить удивление от работы.
А что удивительного?
← →
Sergey13 © (2007-02-02 12:59) [17]> [16] Bless © (02.02.07 12:54)
> А что удивительного?
Попробуй откатить такую транзакцию.
← →
Bless © (2007-02-02 14:01) [18]
> Sergey13 © (02.02.07 12:59) [17]
> Попробуй откатить такую транзакцию.
про откатить я знаю :) Но ты ж про commit говорил, а не про rollback.
← →
Sergey13 © (2007-02-02 14:05) [19]> [18] Bless © (02.02.07 14:01)
А они не связаны?
← →
evvcom © (2007-02-02 14:30) [20]> [16] Bless © (02.02.07 12:54)
> А что удивительного?
Не удивительно, когда понимаешь. А когда не догоняешь, то очень даже "удивительно" :)
← →
Bless © (2007-02-02 14:44) [21]
> Sergey13 © (02.02.07 14:05) [19]
>
> > [18] Bless © (02.02.07 14:01)
> А они не связаны?
Это безусловно разные команды.
← →
Sergey13 © (2007-02-02 14:48) [22]> [21] Bless © (02.02.07 14:44)
Ты поболтать хочешь? 8-)
← →
Bless © (2007-02-02 14:53) [23]
> Ega23 © (02.02.07 11:26) [14]
Имхо, если эта ХП будет вызвана в контексте другой транзакции и будет откачена, то будет ошибка на строчкеROLLBACK TRANSACTION TranClassDel
с сообщениемCannot roll back TranClassDel. No transaction or savepoint of that name was found.
Я не уверен на все 100 процентов, проверь если можно.
← →
Bless © (2007-02-02 14:56) [24]
> Sergey13 © (02.02.07 14:48) [22]
>
> > [21] Bless © (02.02.07 14:44)
>
> Ты поболтать хочешь? 8-)
Я разговор поддерживаю :о)
← →
Bless © (2007-02-02 15:21) [25]
> evvcom © (02.02.07 14:30) [20]
>
> Не удивительно, когда понимаешь. А когда не догоняешь, то
> очень даже "удивительно" :)
Я так понимаю, ты тоже про rollback? Тут я не спорю. Кстати говоря, просматривая эту ветку, мне пришла в голову такая мысль:
если в хранимке вместоBEGIN TRAN
...
DELETE FROM ...
...
ROLLBACK TRAN
написатьIF @@TRANCOUNT>0 SAVE TRAN some_name
ELSE BEGIN TRAN some_name
...
DELETE FROM ...
...
ROLLBACK TRAN some_name
то при вызове этой хранимки в контексе другой транзакции, случись вдруг что, ничего лишнего откачено не будет, вроде, и поведение хранимки перестанет быть "удивительным".
Что скажет народ? Так кто-то делает? Или это бред сивого мерина?
← →
Ega23 © (2007-02-02 15:21) [26]
> Имхо, если эта ХП будет вызвана в контексте другой транзакции
> и будет откачена, то будет ошибка на строчке ROLLBACK TRANSACTION
> TranClassDel с сообщением
> Cannot roll back TranClassDel. No transaction or savepoint
> of that name was found.
>
> Я не уверен на все 100 процентов, проверь если можно.
ОК, проверю. Но точно не сегодня, м.б. в выходные. Сейчас занят - вилы просто...
В понедельник отпишусь.
← →
Bless © (2007-02-02 15:34) [27]
> ОК, проверю. Но точно не сегодня, м.б. в выходные. Сейчас
> занят - вилы просто...
> В понедельник отпишусь.
ОК. Раз уж ответ от тебя будет не скоро, а мне сейчас нефиг чем заняться, то я пока обосную свое утверждение :) Собственно, вся аргументация сводится к цитированию справки:ROLLBACK [ TRAN [ SACTION ]
[ transaction_name | @tran_name_variable
| savepoint_name | @savepoint_variable ] ]
Arguments
transaction_name
Is the name assigned to the transaction on BEGIN TRANSACTION. transaction_name must conform to the rules for identifiers, but only the first 32 characters of the transaction name are used. When nesting transactions, transaction_name must be the name from the outermost BEGIN TRANSACTION statement.
Правда непонятно, какая вообще тогда польза от transaction_name.
← →
evvcom © (2007-02-02 15:38) [28]> [25] Bless © (02.02.07 15:21)
> Я так понимаю, ты тоже про rollback?
Я в общем. Про концепцию. И про rollback, и про commit, да какая собственно разница? И без привязки к конкретному серверу, т.к. на MSSQL не практикуюсь.
← →
Ёжик из тумана (2007-02-02 19:36) [29]Ну вот примерно так
begin trans
insert ....
if @@error <> 0
rollback;
return (1);
end
exec @r = procedure
if @r = 1
rollback;
return (2);
end
commit;
← →
Bless © (2007-02-08 08:58) [30]
> Ega23 © (02.02.07 15:21) [26]
Не проверял?
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2007.04.29;
Скачать: [xml.tar.bz2];
Память: 0.52 MB
Время: 0.048 c