久久久久久久av_日韩在线中文_看一级毛片视频_日本精品二区_成人深夜福利视频_武道仙尊动漫在线观看

如何在 SQL Server 的嵌套過程中處理事務?

How to handle Transaction in Nested procedure in SQL server?(如何在 SQL Server 的嵌套過程中處理事務?)
本文介紹了如何在 SQL Server 的嵌套過程中處理事務?的處理方法,對大家解決問題具有一定的參考價值,需要的朋友們下面隨著小編來一起學習吧!

問題描述

我有 2 個 proc,即 Proc1 和 Proc2.我在 proc2 中執行 proc1.兩個程序中都有多個 DML 操作.proc1 的輸出在 proc2 中用于 DML 操作.如果在 proc2 中發生錯誤,則如何在兩個 proc 中處理事務以回滾所有 DML 操作?

I have 2 proc i.e. Proc1 and Proc2. I am executing proc1 inside proc2. There are multiple DML operation in both procedure. output of proc1 is used in proc2 for DML operation. if Error occurred in proc2 then how to handle transaction in both proc for rollback all DML operation?

我應該在兩個 proc 中都寫事務嗎?

Should I write transaction in both proc?

推薦答案

我們使用基于 http://www.sommarskog.se/error_handling/Part1.html 我們 - 在適用時 - 包括在我們的(嵌套)交易中以確保鏈得到正確管理:

We use a generic error handler procedure based on http://www.sommarskog.se/error_handling/Part1.html that we - when applicable - include in our (nested) transactions to ensure the chain is managed properly:

CREATE PROCEDURE [dbo].[sp_ErrorHandler](@caller VARCHAR(255))
AS BEGIN
    SET NOCOUNT ON;
    DECLARE @errmsg NVARCHAR(2048), @severity TINYINT, @state TINYINT, @errno INT, @lineno INT;
    SELECT @errmsg=REPLACE(ERROR_MESSAGE(), 'DatabaseException: ', 'DatabaseException: '+QUOTENAME(@caller)+' --> ')
         , @severity=ERROR_SEVERITY()
         , @state=ERROR_STATE()
         , @errno=ERROR_NUMBER()
         , @lineno=ERROR_LINE();
    IF @errmsg NOT LIKE 'DatabaseException%' BEGIN
        SELECT @errmsg=N'DatabaseException: '+QUOTENAME(@caller)+N', Line '+LTRIM(STR(@lineno))+N', Error '+LTRIM(STR(@errno))+N': '+@errmsg;
    END;
    RAISERROR('%s', @severity, @state, @errmsg);
END;

(在主庫中編譯并標記為系統程序)

(Compiled in the master database and marked as system procedure)

我們使用這個錯誤處理程序如下.在演示中,我有一個外部 proc 和一個內部 proc 都使用事務.

We use this error handler as follows. In the demo I have an outer proc and an inner proc both using a transaction.

CREATE PROCEDURE dbo.uspOuterProc
AS
  BEGIN
  SET NOCOUNT, XACT_ABORT ON;

  BEGIN TRY
  BEGIN TRANSACTION;

  EXEC dbo.uspInnerProc;

  PRINT 1;

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

  EXEC master.dbo.sp_ErrorHandler @caller = 'dbo.uspOuterProc';
  END CATCH;
  END;
GO

CREATE PROCEDURE dbo.uspInnerProc
AS
  BEGIN
  SET NOCOUNT, XACT_ABORT ON;

  BEGIN TRY
  BEGIN TRANSACTION;

  PRINT 2;

  SELECT 1 / 0;

  PRINT 3;

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

  EXEC master.dbo.sp_ErrorHandler @caller = 'dbo.uspInnerProc';
  END CATCH;
  END;
GO

編譯并運行后:

EXEC dbo.uspOuterProc

你應該得到這個結果:

2

Msg 50000, Level 16, State 1, Procedure sp_ErrorHandler, Line 13 [Batch Start Line 48]
DatabaseException: [dbo.uspOuterProc] --> [dbo.uspInnerProc], Line 12, Error 8134: Divide by zero error encountered.

這篇關于如何在 SQL Server 的嵌套過程中處理事務?的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,也希望大家多多支持html5模板網!

【網站聲明】本站部分內容來源于互聯網,旨在幫助大家更快的解決問題,如果有圖片或者內容侵犯了您的權益,請聯系我們刪除處理,感謝您的支持!

相關文檔推薦

Modify Existing decimal places info(修改現有小數位信息)
The correlation name #39;CONVERT#39; is specified multiple times(多次指定相關名稱“CONVERT)
T-SQL left join not returning null columns(T-SQL 左連接不返回空列)
remove duplicates from comma or pipeline operator string(從逗號或管道運算符字符串中刪除重復項)
Change an iterative query to a relational set-based query(將迭代查詢更改為基于關系集的查詢)
concatenate a zero onto sql server select value shows 4 digits still and not 5(將零連接到 sql server 選擇值仍然顯示 4 位而不是 5)
主站蜘蛛池模板: 91资源在线 | 久久久久久久久久久久久91 | 国产一区二区三区精品久久久 | 人人干人人草 | 中文av电影 | 久久成人激情 | 亚洲一级在线 | 中文字幕视频一区二区 | 午夜理伦三级理论三级在线观看 | 精品国产乱码久久久久久影片 | 国产激情精品 | 中文二区 | 免费一级毛片 | 在线91| 久久久女女女女999久久 | 国产一区二区精品在线 | 久久久成人免费视频 | 欧美精品成人影院 | 亚洲一区二区三区四区视频 | 久久久精品一区 | 精品国产欧美一区二区三区成人 | 国产7777| 国产99小视频 | 自拍在线 | 日韩在线国产 | 伊人啪啪网 | 97福利在线 | 羞羞视频在线观看免费观看 | 夜夜草 | 日韩亚洲欧美一区 | 91精品国产综合久久精品 | 成人在线一区二区 | 久久久久亚洲 | 91久久国产精品 | 成人在线中文字幕 | 中文字幕精品视频 | 成人国产免费视频 | 亚洲人a | 亚洲精品电影网在线观看 | 久久草视频 | 一区二区三区视频免费观看 |