首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

SQL Server 交易與預存程序實戰:飯店房型/房間級聯刪除的正確實作

     編輯:關於SqlServer

場景:飯店系統含 RoomType (主表) 與 Room (從表,FK 關聯)。刪除房型時需同步標記對應房間為已刪除 (軟刪除),若任一步驟失敗全數回滾,保證資料一致性。

資料結構

-- RoomType (主表)
RoomTypeId (PK), TypeName, ..., TypeIsDel (BIT, 0=正常 1=刪除)

-- Room (從表)
RoomId (PK), RoomTypeId (FK), RoomName, ..., RoomIsDel (BIT)

預存程序:交易包裹雙表更新

CREATE PROCEDURE usp_DelRoomType
    @RoomTypeId INT
AS
BEGIN
    SET NOCOUNT ON;
    DECLARE @Error INT = 0;

    BEGIN TRANSACTION;

    -- 1. 標記房型刪除
    UPDATE RoomType SET TypeIsDel = 1 WHERE RoomTypeId = @RoomTypeId;
    SET @Error += @@ERROR;
    IF @Error <> 0
    BEGIN
        ROLLBACK TRANSACTION;
        RETURN -1;
    END

    -- 2. 標記對應房間刪除
    UPDATE Room SET RoomIsDel = 1 WHERE RoomTypeId = @RoomTypeId;
    SET @Error += @@ERROR;
    IF @Error <> 0
    BEGIN
        ROLLBACK TRANSACTION;
        RETURN -1;
    END

    COMMIT TRANSACTION;
    RETURN 0;
END

關鍵設計要點

現代化寫法 (SQL Server 2005+):TRY...CATCH

CREATE PROCEDURE usp_DelRoomType_v2
    @RoomTypeId INT
AS
BEGIN
    SET NOCOUNT ON;
    BEGIN TRY
        BEGIN TRANSACTION;
        UPDATE RoomType SET TypeIsDel = 1 WHERE RoomTypeId = @RoomTypeId;
        UPDATE Room SET RoomIsDel = 1 WHERE RoomTypeId = @RoomTypeId;
        COMMIT TRANSACTION;
    END TRY
    BEGIN CATCH
        IF @@TRANCOUNT > 0 ROLLBACK TRANSACTION;
        -- 記錄錯誤至 Log 表或拋出
        THROW; -- 或 RAISERROR
    END CATCH
END

資料層呼叫 (C# 範例)

using (var conn = new SqlConnection(connStr))
using (var cmd = new SqlCommand("usp_DelRoomType", conn) { CommandType = CommandType.StoredProcedure })
{
    cmd.Parameters.AddWithValue("@RoomTypeId", roomTypeId);
    conn.Open();
    int result = (int)cmd.ExecuteScalar(); // 0 成功, -1 失敗
}

替代方案比較

  • FK CASCADE DELETE:硬刪除,不可逆,不支援軟刪除業務需求。
  • 觸發器:隱性邏輯,除錯困難,效能開銷大。
  • 應用層交易:跨網路往返,延遲高,連線中斷風險大。

預存程序 + 交易為「資料層封裝業務不變量」的最佳實踐。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
技術點說明
軟刪除 (IsDel)避免硬刪除觸發 FK 阻塞、歷史資料遺失、觸發器複雜度
@@ERROR 即時檢查SQL Server 2005 前標準錯誤處理;新版建議用 TRY...CATCH
交易範圍最小化僅包含兩條 UPDATE,鎖定時間極短,降低阻塞風險
參數化防 SQL 注入,利於計畫重用