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

C# 資料庫交易實務(五):儲存點機制與部分回滾實作

     編輯:關於C語言

為什麼需要儲存點?

完整交易回滾成本高(鎖持有久、記錄檔大),且多數更新成功率極高。儲存點允許部分回滾至特定點,避免重做整筆交易,提升吞吐量。

.NET 儲存點 API


// 建立儲存點
transaction.Save("SavePointName");

// 回滾至儲存點
transaction.Rollback("SavePointName");
  • 同名儲存點後建立者覆蓋前者。
  • 儲存點名稱區分大小寫。

完整範例:條件更新配合儲存點


using System;
using System.Data;
using System.Data.SqlClient;

namespace ASPcn {
    public class DbTran {
        public void DoTran() {
            using (SqlConnection conn = GetConn()) {
                conn.Open();
                SqlCommand cmd = conn.CreateCommand();
                SqlTransaction tran = conn.BeginTransaction();
                cmd.Transaction = tran;

                try {
                    cmd.CommandText = "USE pubs";
                    cmd.ExecuteNonQuery();

                    tran.Save("BeforeUpdate"); // 設定儲存點

                    cmd.CommandText = "UPDATE roysched SET royalty = royalty * 1.10 WHERE title_id LIKE 'PC%'";
                    cmd.ExecuteNonQuery();

                    tran.Commit();
                } catch (Exception ex) {
                    tran.Rollback("BeforeUpdate"); // 僅回滾更新部分
                    throw new ApplicationException("交易操作失敗:" + ex.Message);
                }
            }
        }

        private SqlConnection GetConn() {
            string cs = "Data Source=localhost;Integrated Security=SSPI;User ID=sa;Password=";
            return new SqlConnection(cs);
        }
    }

    public class Test {
        public static void Main() {
            new DbTran().DoTran();
            Console.WriteLine("交易處理完成。");
            Console.ReadLine();
        }
    }
}

適用情境判斷

注意事項

  • 儲存點僅在目前交易有效,Commit 或 Rollback (無參數) 後自動失效。
  • 巢狀交易 (TransactionScope + DependentClone) 另行處理,不在此機制範圍。
  • 大量資料更新建議分批提交,配合儲存點控制單批大小。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
條件建議
更新失敗機率極低使用儲存點,避免事前驗證成本
事前驗證成本極高使用儲存點,失敗才回滾
更新失敗機率高事前驗證 + 完整交易,避免頻繁回滾開銷
需審計完整操作軌跡完整交易,不使用部分回滾