15

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

BEGIN TRANSACTION



COMMIT TRANSACTION

如果其中有任何故障,它会自动回滚吗?

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

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

4

4 回答 4

30

我通常在我的存储过程中做这样的事情。它使事情保持良好和安全,并传递我遇到的任何错误。

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
于 2008-11-14T17:13:03.420 回答
4

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

我通常告诉我儿子,你只需要刷你想要保留的牙齿。

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

于 2008-11-14T16:38:07.127 回答
4

如果关闭错误,这将自动回滚事务

SET XACT_ABORT ON

BEGIN TRANSACTION
-- CODE HERE
COMMIT TRANSACTION
于 2008-11-14T16:41:52.920 回答
1

对于事务控制,您使用开始、提交和回滚。您通过提供 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.
于 2008-11-14T16:45:20.667 回答