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
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.