Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Транзакции  [new]
BAH--zer
Member

Откуда: Магнитогогорс
Сообщений: 21
Всем доброго времени суток.
Ситуация - на MSSQL сервере есть хранимая процедура. В ней проходят различного рода проверки, и в случае если эти проверки не срабатывают - пишет ошибку. Ошибки пишутся в базу отдельной функцией для их дальнейшей обработки.
Проблема - после отката действий процедуры в базе пропадают все сообщения что она наплодила. Что впринцепи закономерно - они выполнялись в рамках транзакции и откатились вместе с ней.
Вопрос - есть ли способ оставить эти записи?
  CREATE PROCEDURE [dbo].[TMP1] 	
    AS
  BEGIN	
    BEGIN TRANSACTION;
    declare @out integer =-1
       if (@out<>2)--обычная рядовая проверка
            begin
               EXEC dbo._error_add @Code = 'Ошибка', @Desc = 'Ошибка. Кто то опечатался?', @Type='ERROR'   
               ROLLBACK TRANSACTION
               return;
            end
    COMMIT TRANSACTION MyTransaction ;
  END
  

PS. Я прекрасно понимаю что код написанный выше это ахинея. Но это максимально упрощённая версия того что у меня есть. И этого добра очень много накопипасчено, исправлять все не получится.
ПАЛЫЧ
15 июл 15, 11:19    [17894102]     Ответить | Цитировать Сообщить модератору
 Re: Транзакции  [new]
Glory
Member

Откуда:
Сообщений: 104751
BAH--zer
Вопрос - есть ли способ оставить эти записи?

Не выполнять процедуру в транзакции ?
15 июл 15, 11:21    [17894110]     Ответить | Цитировать Сообщить модератору
 Re: Транзакции  [new]
BAH--zer
Member

Откуда: Магнитогогорс
Сообщений: 21
Транзакция необходима, ввиду того что процедура вызывает множество других процедур. Или может сама быть вызвана такой же процедурой. Сейчас используется контроль по транкаунту и вложенная транзакции не создается, но происходит сохранение, с последующим (в случае ошибки) откатом на это сохранение.
15 июл 15, 11:41    [17894231]     Ответить | Цитировать Сообщить модератору
 Re: Транзакции  [new]
Glory
Member

Откуда:
Сообщений: 104751
BAH--zer
Транзакция необходима, ввиду того что процедура вызывает множество других процедур. Или может сама быть вызвана такой же процедурой. Сейчас используется контроль по транкаунту и вложенная транзакции не создается, но происходит сохранение, с последующим (в случае ошибки) откатом на это сохранение.

Еще раз - не выполнять dbo._error_add в транзакции. А не вообще все
15 июл 15, 11:42    [17894240]     Ответить | Цитировать Сообщить модератору
 Re: Транзакции  [new]
BAH--zer
Member

Откуда: Магнитогогорс
Сообщений: 21
dbo._error_add находится в процедуре которая может иметь любой уровень вложенности в текущую. Я не могу их все вынести из них на верх и проводить проверки до открытия транзакции. Будь таких процедур с десяток - я бы так и сделал, но их намного больше.
15 июл 15, 11:45    [17894261]     Ответить | Цитировать Сообщить модератору
 Re: Транзакции  [new]
Glory
Member

Откуда:
Сообщений: 104751
BAH--zer
dbo._error_add находится в процедуре которая может иметь любой уровень вложенности в текущую

И третий раз

               ROLLBACK TRANSACTION
               EXEC dbo._error_add @Code = 'Ошибка', @Desc = 'Ошибка. Кто то опечатался?', @Type='ERROR'   
               return;
15 июл 15, 11:46    [17894267]     Ответить | Цитировать Сообщить модератору
 Re: Транзакции  [new]
BAH--zer
Member

Откуда: Магнитогогорс
Сообщений: 21
Вы меня не поняли. Привожу более подробный пример.
  CREATE PROCEDURE [dbo].[TMP1] 	
    AS
  BEGIN	
    BEGIN TRANSACTION;
    EXEC TMP.dbo.TMP2 
    COMMIT TRANSACTION MyTransaction ;
  END
  


CREATE PROCEDURE [dbo].[TMP2] 	
AS
BEGIN	
    DECLARE @TranCounter INT  = @@TRANCOUNT, @SavePointName varchar(max) =newid();
    IF @TranCounter > 0    SAVE TRANSACTION @SavePointName;
    ELSE                  BEGIN TRANSACTION;
    BEGIN try	
       declare @param integer;
       EXEC TMP.dbo.TMP3 @out=@param out
       IF (ISNULL(@param,0)=-1) 
              BEGIN
              IF @TranCounter = 0           ROLLBACK TRANSACTION;
              ELSE IF XACT_STATE() <> -1    ROLLBACK TRANSACTION @SavePointName;   
              EXEC dbo._error_add @Code = 'Ошибка', @Desc = 'Ошибка. Третья свалилась, что же делать?', @Type='ERROR'         
              RETURN
              END
       IF @TranCounter = 0              COMMIT TRANSACTION
    END TRY
    BEGIN CATCH   
    END CATCH
END
  


CREATE PROCEDURE [dbo].[TMP3] @out integer out	
AS
BEGIN	
    DECLARE @TranCounter INT  = @@TRANCOUNT, @SavePointName uniqueidentifier =newid();
    IF @TranCounter > 0    SAVE TRANSACTION @SavePointName;
    ELSE                  BEGIN TRANSACTION;
    BEGIN try	
      set @out=-1
       if (@out<>2)--обычная рядовая проверка
            begin
            EXEC dbo._error_add @Code = 'Ошибка', @Desc = 'Ошибка. Кто то опечатался?', @Type='ERROR'   
            return;
            end
       IF @TranCounter = 0              COMMIT TRANSACTION
    END TRY
    BEGIN CATCH    
    END CATCH
END
  
15 июл 15, 11:54    [17894307]     Ответить | Цитировать Сообщить модератору
 Re: Транзакции  [new]
Glory
Member

Откуда:
Сообщений: 104751
BAH--zer
Привожу более подробный пример.

И как в этом примере может отмениться то, что выполнено после транзакции ?
15 июл 15, 11:59    [17894323]     Ответить | Цитировать Сообщить модератору
 Re: Транзакции  [new]
BAH--zer
Member

Откуда: Магнитогогорс
Сообщений: 21
ELSE IF XACT_STATE() <> -1    ROLLBACK TRANSACTION @SavePointName;

Удалит все то что было сделано после сохранения транзакции. Тем самым и результат работы третье тоже.
15 июл 15, 12:01    [17894331]     Ответить | Цитировать Сообщить модератору
 Re: Транзакции  [new]
Glory
Member

Откуда:
Сообщений: 104751
BAH--zer
Удалит все то что было сделано после сохранения транзакции.

Даже все то, что будет выполнение ПОСЛЕ этой команды ?
15 июл 15, 12:03    [17894338]     Ответить | Цитировать Сообщить модератору
 Re: Транзакции  [new]
BAH--zer
Member

Откуда: Магнитогогорс
Сообщений: 21
Он удалит результат выполнения третье процедуры.
EXEC dbo._error_add @Code = 'Ошибка', @Desc = 'Ошибка. Кто то опечатался?', @Type='ERROR' 

То что следующее сообщение останется в живых я прекрасно понимаю.
EXEC dbo._error_add @Code = 'Ошибка', @Desc = 'Ошибка. Третья свалилась, что же делать?', @Type='ERROR'
15 июл 15, 12:05    [17894344]     Ответить | Цитировать Сообщить модератору
 Re: Транзакции  [new]
Сон Веры Павловны
Member

Откуда:
Сообщений: 6192
ТС'у явно хочется оракловых autonomous transactions. В MSSQL их как таковых нет, но аналогичного результата добиваются либо манипуляциями с savepoints, либо через логирование в loopback linked server (тынц). Есть еще варианты - гугл в помощь.
15 июл 15, 12:08    [17894356]     Ответить | Цитировать Сообщить модератору
 Re: Транзакции  [new]
Glory
Member

Откуда:
Сообщений: 104751
BAH--zer
Он удалит результат выполнения третье процедуры.

Почему же в ней обработка ошибок сделана по другому, если "То что следующее сообщение останется в живых я прекрасно понимаю" ?
15 июл 15, 12:09    [17894358]     Ответить | Цитировать Сообщить модератору
 Re: Транзакции  [new]
BAH--zer
Member

Откуда: Магнитогогорс
Сообщений: 21
Если я вас правильно понял, вы предлагаете добавить ролбек и в третью процедуру.
       if (@out<>2)--обычная рядовая проверка
            begin
            IF @TranCounter = 0           ROLLBACK TRANSACTION;
            ELSE IF XACT_STATE() <> -1    ROLLBACK TRANSACTION @SavePointName;
            EXEC dbo._error_add @Code = 'Ошибка', @Desc = 'Ошибка. Кто то опечатался?', @Type='ERROR'   
            return;
            end

но я не вижу в этом смысла потому что ролбек во второй процедуре его все равно сотрет, потому и не стал добавлять.

Ссылки читаю, спасибо.
15 июл 15, 12:16    [17894378]     Ответить | Цитировать Сообщить модератору
 Re: Транзакции  [new]
Glory
Member

Откуда:
Сообщений: 104751
BAH--zer
но я не вижу в этом смысла потому что ролбек во второй процедуре его все равно сотрет, потому и не стал добавлять

Я тоже не вижу смылса в такой вашей обоработке ошибок
15 июл 15, 12:21    [17894391]     Ответить | Цитировать Сообщить модератору
 Re: Транзакции  [new]
invm
Member

Откуда: Москва
Сообщений: 9785
15757563
17329722

Модифицировать нужно будет только dbo._error_add
15 июл 15, 12:22    [17894398]     Ответить | Цитировать Сообщить модератору
 Re: Транзакции  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8723
BAH--zer, откат должна производить самая верхняя процедура, процедура, в которой произошла ошибка, выбрасывает сообщение наверх. Верхняя процедура пишет в журнал ошибок переданную ей ошибку. Каждая процедура, принимающая ошибку, дописывает в сообщение свое имя, чтобы можно было отследить цепочку вызова.
15 июл 15, 12:24    [17894407]     Ответить | Цитировать Сообщить модератору
 Re: Транзакции  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8723
Да, конечно же, запись текста сообщения об ошибке в журнал необходимо производить после отката.
15 июл 15, 12:26    [17894416]     Ответить | Цитировать Сообщить модератору
 Re: Транзакции  [new]
BAH--zer
Member

Откуда: Магнитогогорс
Сообщений: 21
Я уже писал выше, что код приведенный здесь логически не верен (ахинея). Но мне нужен совет который поможет его сделать работоспособным, ввиду того что переделывать его бессмысленно. Слишком многое уже сделано.
15 июл 15, 12:28    [17894427]     Ответить | Цитировать Сообщить модератору
 Re: Транзакции  [new]
Glory
Member

Откуда:
Сообщений: 104751
BAH--zer
Но мне нужен совет который поможет его сделать работоспособным, ввиду того что переделывать его бессмысленно.

Помочь вам найти волшебную настройку "щоб все работало" ?
15 июл 15, 12:29    [17894435]     Ответить | Цитировать Сообщить модератору
 Re: Транзакции  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8723
BAH--zer,

Если что-то неверно сделано по-моему нет понятия "слишком много уже написано"... Впрочем, дело хозяйское...
15 июл 15, 12:30    [17894440]     Ответить | Цитировать Сообщить модератору
 Re: Транзакции  [new]
BAH--zer
Member

Откуда: Магнитогогорс
Сообщений: 21
Я с мс скл-ем работаю не так давно и много чего о нем не знаю. Поэтому и написал сюда. Перепиливать хозяйство имеющее порядка 1-2 тыс разношёрстных процедур дело очень веселое.
Думаю через сервер-костыль должно получится.
Спасибо за беседу.
15 июл 15, 12:46    [17894535]     Ответить | Цитировать Сообщить модератору
 Re: Транзакции  [new]
Arm79
Member

Откуда: МО, Раменское
Сообщений: 3695
Service Broker
15 июл 15, 15:07    [17895425]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить