Автономная транзакция в MS SQL 2000
От: Tanya  
Дата: 06.05.05 11:56
Оценка:
Надо перевести хранимые процедуры с ORACLE на MS SQL 2000
Допустим, есть "рабочая" процедура spWork, которая завершается или ROLLBACK или COMMIT-м всех своих действий (вставки, удаления и т.п). Внутри spWork для записи лога (внутри транзакции) вызывается хранимая процедура spWriteLog().

Процедура spWriteLog(), которая пишет лог ошибок в базу под ORACLE работает в автономной транзакции и все OK . Есть ли аналог этого в MS SQL? А то сейчас под MS, если делается ROLLBACK, то все, что писалось в лог пропадат.

Спасибо.
Re: Автономная транзакция в MS SQL 2000
От: ksg71 Германия  
Дата: 06.05.05 11:59
Оценка:
Здравствуйте, Tanya, Вы писали:

T>Надо перевести хранимые процедуры с ORACLE на MS SQL 2000

T>Допустим, есть "рабочая" процедура spWork, которая завершается или ROLLBACK или COMMIT-м всех своих действий (вставки, удаления и т.п). Внутри spWork для записи лога (внутри транзакции) вызывается хранимая процедура spWriteLog().

T>Процедура spWriteLog(), которая пишет лог ошибок в базу под ORACLE работает в автономной транзакции и все OK . Есть ли аналог этого в MS SQL? А то сейчас под MS, если делается ROLLBACK, то все, что писалось в лог пропадат.


T>Спасибо.



нет таких транзакций в MS SQL.
Das Reich der Freiheit beginnt da, wo die Arbeit aufhört. (c) Karl Marx
Re: Автономная транзакция в MS SQL 2000
От: Козьма Прутков Россия  
Дата: 06.05.05 12:00
Оценка:
Tanya wrote:
> Надо перевести хранимые процедуры с ORACLE на MS SQL 2000
> Допустим, есть "рабочая" процедура spWork, которая завершается или ROLLBACK или COMMIT-м всех своих действий (вставки, удаления и т.п). Внутри spWork для записи лога (внутри транзакции) вызывается хранимая процедура spWriteLog().
>
> Процедура spWriteLog(), которая пишет лог ошибок в базу под ORACLE работает в автономной транзакции и все OK . Есть ли аналог этого в MS SQL? А то сейчас под MS, если делается ROLLBACK, то все, что писалось в лог пропадат.
>
> Спасибо.
тут
Автор: Козьма Прутков
Дата: 27.04.05
Posted via RSDN NNTP Server 2.0 beta
Да хранит вас господь в сухом прохладном месте...
Re[2]: Автономная транзакция в MS SQL 2000
От: ksg71 Германия  
Дата: 06.05.05 12:03
Оценка:
Здравствуйте, Козьма Прутков, Вы писали:

КП>Tanya wrote:

>> Надо перевести хранимые процедуры с ORACLE на MS SQL 2000
>> Допустим, есть "рабочая" процедура spWork, которая завершается или ROLLBACK или COMMIT-м всех своих действий (вставки, удаления и т.п). Внутри spWork для записи лога (внутри транзакции) вызывается хранимая процедура spWriteLog().
>>
>> Процедура spWriteLog(), которая пишет лог ошибок в базу под ORACLE работает в автономной транзакции и все OK . Есть ли аналог этого в MS SQL? А то сейчас под MS, если делается ROLLBACK, то все, что писалось в лог пропадат.
>>
>> Спасибо.
КП>тут
Автор: Козьма Прутков
Дата: 27.04.05



Причем это здесь?
Речь идет не о вложенных транзакция, а об автономных, это "две большие разницы"
Das Reich der Freiheit beginnt da, wo die Arbeit aufhört. (c) Karl Marx
Re: Автономная транзакция в MS SQL 2000
От: crackoff Россия  
Дата: 06.05.05 12:29
Оценка:
Здравствуйте, Tanya, Вы писали:

T>Надо перевести хранимые процедуры с ORACLE на MS SQL 2000

T>Допустим, есть "рабочая" процедура spWork, которая завершается или ROLLBACK или COMMIT-м всех своих действий (вставки, удаления и т.п). Внутри spWork для записи лога (внутри транзакции) вызывается хранимая процедура spWriteLog().

T>Процедура spWriteLog(), которая пишет лог ошибок в базу под ORACLE работает в автономной транзакции и все OK . Есть ли аналог этого в MS SQL? А то сейчас под MS, если делается ROLLBACK, то все, что писалось в лог пропадат.


T>Спасибо.



CREATE  procedure [Owner].[Bla-bla-bla] 
AS

declare @TranLevel INT

    -- полный откат транзакции с возвратом исключения на клиента
    SET XACT_ABORT ON
    -- не возвращать клиенту инф. о количестве произведённых действий
    SET NOCOUNT ON
    -- переменная для проверки уровня вложенности транзакции
    SET @TranLevel = @@TRANCOUNT
    -- если больше 0, то ХП запущена в контексте транзакции
    IF (@TranLevel > 0)  GOTO proc_body
    -- уровень изоляции транзакции ...
    SET TRANSACTION ISOLATION LEVEL READ COMMITTED
    -- стартовать транзакцию
    BEGIN TRAN

proc_body:

------------
--  процедура

--  если понадобилась проверка с откатом
/*
    IF (...) BEGIN
        RAISERROR('Сообщение об ошибке', 16, 1)
        ROLLBACK TRAN
        RETURN -1
    END  
*/

    IF (@TranLevel > 0) GOTO proc_exit
    COMMIT TRAN

proc_exit:
GO


Такая конструкция, внесенная в каждую ХП обеспечит полный откат транзакции при каком-либо исключении на любом уровне вложенности. При этом, если исключение произойдет в spWriteLog, откатятся и все действия spWork. Если надо по другому, смотри "SAVE TRANSACTION" в BOL
Re[2]: Автономная транзакция в MS SQL 2000
От: ksg71 Германия  
Дата: 06.05.05 12:43
Оценка:
Здравствуйте, crackoff,

да это все не то.

Работает процедура в транзакции, чего-то делает, надо вести протокол,
чего ни делай — если внешняя транзакция откатится, весь протокол потерян.
Варианты решения в принципе таковы

— сохранять данные в локальной переменной и после завершения транзакции инсертить их в таблицу
— писать extended SP, которая откроет свой независимый коннект и все операции через него
будут "автономными"
Das Reich der Freiheit beginnt da, wo die Arbeit aufhört. (c) Karl Marx
Re[3]: Автономная транзакция в MS SQL 2000
От: Tanya  
Дата: 06.05.05 13:14
Оценка:
Здравствуйте, ksg71, Вы писали:
K>Варианты решения в принципе таковы

K>- сохранять данные в локальной переменной и после завершения транзакции инсертить их в таблицу

K>- писать extended SP, которая откроет свой независимый коннект и все операции через него
K> будут "автономными"

Спасибо. Видимо действительно придется "выкручиваться". Эх, все-таки с MS SQL на ORACLE переводить на много легче, чем обратно...
Re[4]: Автономная транзакция в MS SQL 2000
От: andsm Россия  
Дата: 06.05.05 14:22
Оценка:
Здравствуйте, Tanya, Вы писали:

T>Спасибо. Видимо действительно придется "выкручиваться". Эх, все-таки с MS SQL на ORACLE переводить на много легче, чем обратно...


Еще вариант — запоминать то что нужно записать в таблице-переменной. На нее rollback не действует.
Кстати, мне с MS SQL на Oracle было сложнее переходить чем обратно
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.