使用事务 - 最佳实践

use*_*915 2 t-sql sql-server stored-procedures transactions

假设我在SQL服务器中有一个程序:

create procedure BULKINSERT
AS
 INSERT INTO TABLEB (
 SELECT NAME, ID From TableA
)
GO   
Run Code Online (Sandbox Code Playgroud)

一个简单的一个读取数据从TABLE A并插入到TABLE B。如果我有 100 万条记录要插入到表 B 中,并且如果一条记录由于某种原因失败,在这种情况下我应该使用TRANSACTION还是不使用?

我应该回滚整个操作吗?

got*_*tqn 5

您可以为存储过程使用以下模板:

SET NOCOUNT, XACT_ABORT ON;

    BEGIN TRY

        BEGIN TRANSACTION;
        -- CODE BLOCK GOES HERE
        COMMIT TRANSACTION;

    END TRY
    BEGIN CATCH 

       IF @@TRANCOUNT > 0
       BEGIN
          ROLLBACK TRANSACTION
       END;

       -- GET ERRORS DETAILS OR THROW ERROR

    END CATCH;

SET NOCOUNT, XACT_ABORT OFF;
Run Code Online (Sandbox Code Playgroud)

更多细节:

  • XACT_ABORT - 指定当 Transact-SQL 语句引发运行时错误时 SQL Server 是否自动回滚当前事务;

  • 如果您需要有关错误的信息(ERROR_MESSAGE , ERROR_LINE, ERROR_NUMBER, ERROR_PROCEDURE, ERROR_SEVERITY, ERROR_STATE)

这是处理事务的通用技术。我会推荐以下文章Erland Sommarskog

  1. SQL Server 中的错误和事务处理第 1 部分 - 快速启动错误处理
  2. SQL Server 中的错误和事务处理第二部分 - 命令和机制