完整交易回滾成本高(鎖持有久、記錄檔大),且多數更新成功率極高。儲存點允許部分回滾至特定點,避免重做整筆交易,提升吞吐量。
// 建立儲存點
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();
}
}
}
| 條件 | 建議 |
|---|---|
| 更新失敗機率極低 | 使用儲存點,避免事前驗證成本 |
| 事前驗證成本極高 | 使用儲存點,失敗才回滾 |
| 更新失敗機率高 | 事前驗證 + 完整交易,避免頻繁回滾開銷 |
| 需審計完整操作軌跡 | 完整交易,不使用部分回滾 |