sqlserver中事务的基本模板

时间:2008-11-14 16:33:59

标签: sql-server transactions

如果我只是用以下内容包装我的查询:

BEGIN TRANSACTION



COMMIT TRANSACTION

如果内部有任何失败,它会自动回滚吗?

从查看其他代码,他们似乎检查错误,如果有错误,那么他们执行GOTO语句,然后调用ROLLBACK TRANSACTION

但这似乎是分配工作,每次插入/更新后都必须检查IF(@@ ERROR<> 0)。

4 个答案:

答案 0 :(得分:27)

我通常在存储过程中执行类似的操作。它保持了良好和安全,并传递了我遇到的任何错误。

SET XACT_ABORT ON;

BEGIN TRY
    BEGIN TRANSACTION;

    -- Code goes here

    COMMIT TRANSACTION;
END TRY
BEGIN CATCH
    IF @@TRANCOUNT > 0
        ROLLBACK TRANSACTION;

    DECLARE
        @ERROR_SEVERITY INT,
        @ERROR_STATE    INT,
        @ERROR_NUMBER   INT,
        @ERROR_LINE     INT,
        @ERROR_MESSAGE  NVARCHAR(4000);

    SELECT
        @ERROR_SEVERITY = ERROR_SEVERITY(),
        @ERROR_STATE    = ERROR_STATE(),
        @ERROR_NUMBER   = ERROR_NUMBER(),
        @ERROR_LINE     = ERROR_LINE(),
        @ERROR_MESSAGE  = ERROR_MESSAGE();

    RAISERROR('Msg %d, Line %d, :%s',
        @ERROR_SEVERITY,
        @ERROR_STATE,
        @ERROR_NUMBER,
        @ERROR_LINE,
        @ERROR_MESSAGE);
END CATCH

答案 1 :(得分:4)

是的,在它不起作用的情况下显式回滚事务是很重要的。

我经常告诉我的儿子你只需要刷牙就可以了。

在这种情况下,您只需要回滚不想执行的命令。

答案 2 :(得分:4)

如果出现错误,这将自动回滚事务

SET XACT_ABORT ON

BEGIN TRANSACTION
-- CODE HERE
COMMIT TRANSACTION

答案 3 :(得分:1)

对于事务控制,您使用begin,commit和rollback。您通过提供BEGIN TRANSACTION开始交易。然后你把你需要的各种SQL语句。然后通过发出提交或回滚来结束事务。 COMMIT TRANSACTION将提交您在BEGIN语句之后对数据库所做的所有更改,并将它们永久化,可以这么说。 ROLLBACK TRANSACTION将在BEGIN语句之后回滚您对数据库所做的所有更改。但是,它不会更改变量值。

示例:

BEGIN TRANSACTION

UPDATE table SET column = 'ABC' WHERE column = '123'

COMMIT TRANSACTION

--//column now has a value of 'ABC'

BEGIN TRANSACTION

UPDATE table SET column = 'ABC' WHERE column = '123'

ROLLBACK TRANSACTION

--//column still has it's previous value ('123') No changes were made.