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

Вниз

Транзакции в хранимках   Найти похожие ветки 

 
Ёжик из тумана   (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;
Скачать: CL | DM;

Наверх




Память: 0.55 MB
Время: 0.04 c
1-1173026527
Bogdan1024
2007-03-04 19:42
2007.04.29
Крутящийся контрол


15-1175376233
Gero
2007-04-01 01:23
2007.04.29
Всем, кому интересна судьба DMClient


6-1162525572
tarantul_ip02
2006-11-03 06:46
2007.04.29
Сделал бота для сетей irc. Есть проблема.


9-1148581647
Shmidt
2006-05-25 22:27
2007.04.29
Как сделать чтобы после выстрелов по 5 мишеням появилось сообщени


15-1175711002
Kostafey
2007-04-04 22:23
2007.04.29
Что за баг такой странный: Circular datalinks are not allowed.