SQL Server 存儲過程開發手冊

SQL Server 存儲過程開發手冊(更新版)

根據要求,重新整理并加入了事務控制、異常日志記錄和返回狀態碼的設計。以下是詳細說明:


1. 總則

1.1 目標

本手冊旨在為 SQL Server 存儲過程的編寫提供一套完整的規范,確保系統的事務控制、異常處理、日志記錄和狀態碼返回清晰明確,優化數據一致性、系統穩定性和性能。


2. 事務控制與層次化設計

2.1 事務控制原則

根據業務的需求和事務的粒度,存儲過程應分為不同的層次,每個層次的事務控制和異常處理策略不同,具體如下表所示:

層次控制事務記錄異常日志返回狀態碼
主流程 (Main)???
子事務 (SubTx)???
功能性操作 (Func)??可選
  • 主流程 (Main)

    • 不控制事務,負責協調和調用子事務或功能性操作。

    • 記錄異常日志,捕獲并輸出錯誤信息。

    • 返回狀態碼,以通知調用方執行狀態(成功或失敗)。

  • 子事務 (SubTx)

    • 控制事務,開始和提交或回滾事務。

    • 記錄異常日志,在發生異常時捕獲并輸出錯誤信息。

    • 返回狀態碼,標識事務是否成功完成。

  • 功能性操作 (Func)

    • 不控制事務,通常是讀取操作或不涉及數據修改的輔助功能。

    • 不記錄異常日志(除非必要),通常這些操作在主流程中捕獲異常。

    • 返回狀態碼可選,根據具體業務需要決定是否返回。


3. 存儲過程命名規范

存儲過程命名應該遵循以下結構,便于識別和維護:

proc_領域_子領域_類型
  • 領域 (Domain):表示存儲過程所屬的業務領域,如訂單、用戶、商品等。

  • 子領域 (SubDomain):表示存儲過程在領域中的具體細分模塊,如發貨、支付、庫存等。

  • 類型 (Type):表示存儲過程的類型,分為三種類型:

    • Main:主流程,負責協調其他子事務和功能性操作。

    • SubTx:子事務,負責數據更新和事務控制。

    • Func:功能性操作,通常是查詢或計算操作。

3.1 示例命名

  • proc_Order_Shipment_SubTx:表示“訂單”領域中的“發貨”子領域的子事務,涉及事務控制。

  • proc_Order_Payment_Main:表示“訂單”領域中的“支付”子領域的主流程,負責調用其他子事務。

  • proc_Inventory_Check_Func:表示“庫存”領域中的“檢查”功能,通常用于查詢操作,不涉及事務控制。


4. 存儲過程設計與事務控制

4.1 主流程存儲過程

主流程存儲過程不涉及事務控制,它的職責是調用子事務和功能性操作,并記錄異常日志和返回執行狀態碼。

CREATE PROCEDURE proc_Order_Shipment_Main@OrderId INT,@code INT output,@msg varchar(500) output
AS
BEGINBEGIN TRY-- 調用子事務,子事務控制事務EXEC proc_Order_Shipment_SubTx @OrderId, @code,@msg  ;if(@code!=200){-- 記錄失敗原因,處理失敗帶來的影響return}-- 調用功能性操作(如果需要)EXEC proc_Inventory_Check_Func @OrderId, @code,@msg ;if(@code!=200){-- 記錄失敗原因,處理失敗帶來的影響return}-- 返回成功狀態碼set @code=200END TRYBEGIN CATCH-- 捕獲并記錄異常日志PRINT 'Error in proc_Order_Shipment_Main: ' + ERROR_MESSAGE();-- 返回失敗狀態碼RETURN 1; -- 狀態碼:1 表示失敗END CATCH
END;

4.2 子事務存儲過程

子事務存儲過程負責控制事務,它需要開始、提交和回滾事務,并在發生異常時記錄日志和返回狀態碼。

CREATE PROCEDURE proc_Order_Shipment_SubTx@OrderId INT,@code INT output,@msg varchar(500) output
AS
BEGIN-- 開始事務BEGIN TRANSACTION;BEGIN TRY-- 訂單發貨相關的數據庫操作UPDATE dbo.OrderSET ShipmentStatus = 'Shipped'WHERE OrderId = @OrderId;-- 提交事務COMMIT TRANSACTION;-- 返回成功狀態碼RETURN 0; -- 狀態碼:0 表示成功END TRYBEGIN CATCH-- 發生錯誤時回滾事務ROLLBACK TRANSACTION;-- 記錄異常日志PRINT 'Error in proc_Order_Shipment_SubTx: ' + ERROR_MESSAGE();-- 返回失敗狀態碼RETURN 1; -- 狀態碼:1 表示失敗END CATCH
END;

4.3 功能性操作存儲過程

功能性操作通常是只執行查詢或計算,不涉及數據修改,因此不控制事務。日志記錄和狀態碼返回可選,具體業務需求決定。

CREATE PROCEDURE proc_Inventory_Check_Func@OrderId INT,@code INT output,@msg varchar(500) output
AS
BEGIN-- 查詢操作,檢查庫存SELECT ProductId, AvailableStockFROM dbo.InventoryWHERE ProductId IN (SELECT ProductId FROM dbo.OrderItems WHERE OrderId = @OrderId);
END;

5. 錯誤處理與日志記錄

5.1 錯誤處理

  • 主流程:主流程存儲過程捕獲所有子事務和功能性操作中的異常,但不控制事務回滾。它應當記錄異常日志,并返回相應的狀態碼(通常是 0 或 1)。

  • 子事務:子事務存儲過程必須通過 BEGIN TRYBEGIN CATCH 語句來捕獲異常,并在異常發生時回滾事務。所有異常都應該記錄日志,并返回狀態碼,標識事務是否成功。

  • 功能性操作:功能性操作通常不捕獲異常,也不記錄日志,異常處理依賴于主流程。

5.2 異常日志記錄

所有的異常都應通過日志記錄下來,方便后期排查和優化。可以使用 PRINTRAISEERROR 語句來記錄錯誤消息。

BEGIN CATCHPRINT 'Error: ' + ERROR_MESSAGE();-- 或者使用 RAISEERROR 記錄更詳細的日志-- RAISEERROR('Error in procedure: %s', 16, 1, ERROR_MESSAGE());THROW;
END CATCH

6. 返回狀態碼

每個存儲過程在執行完畢后應返回一個狀態碼,狀態碼通常為:

  • 0:表示操作成功。

  • 1:表示操作失敗(可根據需要擴展更多狀態碼,表示不同類型的錯誤)。

返回狀態碼用于調用方判斷存儲過程執行是否成功,并做相應的處理。


7. 性能優化與鎖爭用

  • 避免長事務:事務內只包含必要的數據庫操作,避免外部接口或延時任務的調用。

  • 批量處理:對于需要更新大量數據的操作,盡量使用批量處理,減少事務鎖的持有時間。

  • 索引優化:確保數據庫表有適當的索引,以加速查詢和數據操作。


8. 審查與監控

8.1 代碼審查標準

  • 確保每個存儲過程的事務控制符合規范。

  • 確保異常處理機制完備,并且日志記錄充分。

  • 確保存儲過程有清晰的返回狀態碼,便于系統監控。

8.2 監控與日志

  • 監控長時間運行的事務,避免事務阻塞。

  • 配置合適的告警機制,及時捕獲死鎖或其他異常。


總結

  • 通過分層設計,每個存儲過程的責任清晰,主流程不控制事務,子事務控制事務,功能性操作不涉及事務管理。

  • 存儲過程命名規則統一,便于后續維護和擴展。

  • 錯誤處理和日志記錄是保證系統穩定性的關鍵,每個存儲過程都應有明確的異常處理和日志記錄機制。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/81259.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/81259.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/81259.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

深海科技服務博客簡介

人人可學,人人可用,IT與AI不是高不可攀! 博客宗旨 深海科技服務博客致力于: 推廣IT與AI的實際應用,降低入門門檻,讓更多個人和中小企業能夠以最少投入、高效實現信息化、智能化。 分享開源免費軟件、簡單…

本地大模型編程實戰(29)查詢圖數據庫NEO4J(2)

上一篇文章 用大語言模型LLM查詢圖數據庫NEO4J(1) 介紹了使用GraphQACypherChain查詢NEO4J。用它實現簡單快捷,但是不容易定制,在生產環境中可能會面臨挑戰。 本文將基于langgraph 框架,用LLM(大語言模型)查詢圖數據庫NEO4J。它可以定義清晰復…

RPG_5.角色動畫

1.創建一個動畫實例 2.創建該實例的c子類 3.繼續創建該類的子類,但是作用是用來鏈接(以后會詳細解釋) 4.基于PlayerAnimInstance類創建一個子類 5.目前一共創建了四個c類, 最基的類 角色的類 玩家控制的角色的類 玩家控制的角…

Sigmoid函數導數推導詳解

Sigmoid函數導數推導詳解 在邏輯回歸中,Sigmoid函數的導數推導是一個關鍵步驟,它使得梯度下降算法能夠高效地計算。 1. Sigmoid函數定義 首先回顧Sigmoid函數的定義: g ( z ) 1 1 e ? z g(z) \frac{1}{1 e^{-z}} g(z)1e?z1? 2. 導…

MS31860T——8 通道串行接口低邊驅動器

MS31860T 是一款 8 通道低邊驅動器,包含 SPI 串口通信、 PWM斬波器配置、過流保護、短路保護、欠壓鎖定和過熱關斷功能, 芯片可以讀取每個通道的狀態。MS31860T 可以診斷開路的負載情況,并可以讀取故障信息。外部故障引腳指示芯片的故障狀態。…

騰訊 Kuikly 正式開源,了解一下這個基于 Kotlin 的全平臺框架

在 3月的時候通過 《騰訊 TDF 即將開源 Kuikly 跨端框架,Kotlin 支持全平臺》 我們大致知道了 Kuikly 的基本情況,Kuikly 是一個面向終端技術棧的跨端開發框架,完全基于kotlin語言開發,提供原生的性能和體驗。 按照官方的說法&…

AI驅動UI自動化測試框架調研

隨著應用復雜度增加,手動測試變得費時且易出錯,而自動化測試可提高效率和可靠性。如何借助大模型和一些自動化測試框架進行自動化測試,是一個研發團隊很重要的訴求。 目前主流的自動化測試框架很多,Midscene.js結合Playwright提供…

關系型數據庫設計指南

1. 前言 在自己獨立開發一個項目的過程中,我發現了一些以往寫小 Demo 從來沒有遇到過的問題。 最近在獨立制作一個全棧的通知管理平臺。一開始我沒有考慮太多,直接根據頭腦中零星的想法就開擼后端數據庫 model 和 API,用的是學了半成品的 M…

詳解TypeScript中的類型斷言及其繞過類型檢查機制

TypeScript中的類型斷言及其繞過類型檢查機制 一、類型斷言的本質與工作原理編譯時與運行時的區別TypeScript編譯器處理類型斷言的步驟 二、類型斷言的詳細語法與進階用法基礎語法對比鏈式斷言斷言修飾符1. 非空斷言操作符 (!)代碼分析1. getLength 函數分析用法說明&#xff1…

XLSX.utils.sheet_to_json設置了blankrows:true,但無法獲取到開頭的空白行

在用sheetJs的XLSX庫做導入,遇到一個bug。如果開頭行是空白行的話,調用sheet_to_json轉數組獲得的數據也是沒有包含空白行的。這樣會導致在設置對應的起始行時,解析數據不生效。 目前是直接跳過了開頭的兩行空白行 正確應該獲得一下數據 問…

PostgreSQL 數據庫下載和安裝

官網: PostgreSQL: Downloads 推薦下載網站:EDB downloads postgresql 我選了 postgresql-15.12-1-windows-x64.exe 鼠標雙擊,開始安裝: 安裝路徑: Installation Directory: D:\Program Files\PostgreSQL\15 Serv…

一、Javaweb是什么?

1.1 客戶端與服務端 客戶端 :用于與用戶進行交互,接受用戶的輸入或操作,且展示服務器端的數據以及向服務器傳遞數據。 例如:手機app,微信小程序、瀏覽器… 服務端 :與客戶端進行交互,接受客戶…

奇偶ASCII值判斷

奇偶ASCII值判斷 Description 任意輸入一個字符,判斷其ASCII是否是奇數,若是,輸出YES,否則,輸出NO。例如,字符A的ASCII值是65,則輸出YES,若輸入字符B(ASCII值是66),則輸…

OpenCV 圖形API(74)圖像與通道拼接函數-----合并三個單通道圖像(GMat)為一個多通道圖像的函數merge3()

操作系統:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 編程語言:C11 算法描述 從3個單通道矩陣創建一個3通道矩陣。 此函數將多個矩陣合并以生成一個單一的多通道矩陣。即,輸出矩陣的每個元素將是輸入矩陣元素的…

多節點監測任務分配方法比較與分析

多監測節點任務分配方法是分布式系統、物聯網(IoT)、工業監測等領域的核心技術,其核心目標是在資源受限條件下高效分配任務,以優化系統性能。以下從方法分類、對比分析、應用場景選擇及挑戰等方面進行系統闡述: 圖1 多…

【推薦系統筆記】BPR損失函數公式

一、BPR損失函數公式 BPR 損失函數的核心公式如下: L BPR ? ∑ ( u , i , j ) ∈ D ln ? σ ( x ^ u i j ) λ ∣ ∣ Θ ∣ ∣ 2 L_{\text{BPR}} - \sum_{(u, i, j) \in D} \ln \sigma(\hat{x}_{uij}) \lambda ||\Theta||^2 LBPR??(u,i,j)∈D∑?lnσ(x^ui…

Java 核心--泛型枚舉

作者:IvanCodes 發布時間:2025年4月30日🤓 專欄:Java教程 各位 CSDN伙伴們,大家好!👋 寫了那么多代碼,有沒有遇到過這樣的“驚喜”:滿心歡喜地從 ArrayList 里取出數據…

新能源行業供應鏈規劃及集成計劃報告(95頁PPT)(文末有下載方式)

資料解讀:《數字化供應鏈規劃及集成計劃現狀評估報告》 詳細資料請看本解讀文章的最后內容。 該報告圍繞新能源行業 XX 企業供應鏈展開,全面評估其現狀,剖析存在的問題,并提出改進方向和關鍵舉措,旨在提升供應鏈競爭力…

Centos 7 yum配置出現一下報錯:

One of the configured repositories failed (CentOS-$releaserver-Base), and yum doesnt have enough cached data to continue. At this point the only safe thing yum can do is fail. There are a few ways to work "fix" this: 1.解決CentOS Yum Repositor…

Redis 常見問題深度剖析與全方位解決方案指南

Redis 是一款廣泛使用的開源內存數據庫,在實際應用中常會遇到以下一些常見問題: 1.內存占用問題 問題描述:隨著數據量的不斷增加,Redis 占用的內存可能會超出預期,導致服務器內存不足,影響系統的穩定性和…