Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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.043 c
2-1176170835
minutka17
2007-04-10 06:07
2007.04.29
While:найти номер эл-та последовательности


2-1176209574
Mishenka
2007-04-10 16:52
2007.04.29
Имя компонента


11-1156517931
Vladimir Kladov
2006-08-25 18:58
2007.04.29
Версия 2.38


2-1175707512
Washington
2007-04-04 21:25
2007.04.29
Ярлык программы


15-1175260410
Reaktor
2007-03-30 17:13
2007.04.29
Если свич воткнуть в свич





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