using (DbTrans trans = DbSession.Default.BeginTransaction()) {
trans.Update(Products._.ProductName, "apple", Products._.ProductID == 1);
trans.Update(Products._.ProductName, "egg", Products._.ProductID == 2);
trans.Commit(); // 明確提交
}
// 區塊結束自動 Dispose,若未 Commit 則自動 Rollback
產生 SQL:兩條參數化 UPDATE 陳述句,同一交易內執行。
DbTrans trans = DbSession.Default.BeginTransaction();
try {
trans.Update(Products._.ProductName, "apple", Products._.ProductID == 1);
trans.Update(Products._.ProductName, "egg", Products._.ProductID == 2);
trans.Commit();
}
catch {
trans.Rollback();
}
finally {
trans.Close(); // 必須關閉釋放連線
}
| 特性 | using 區塊 | Try-Catch |
|---|---|---|
| 程式碼行數 | 少 | 多 |
| 例外自動 Rollback | 是(Dispose 時檢查) | 需手動 catch Rollback |
| 連線釋放時機 | 區塊結束 | finally Close() |
| 巢狀交易 | 不支援(單層) | 不支援 |
DbTrans 參數加入交易。BeginTransaction(IsolationLevel.ReadCommitted)。using (DbTrans trans = DbSession.Default.BeginTransaction()) {
trans.Update(...);
// 同一交易內查詢:可見未認可變更
var p = trans.From().Where(...).ToFirst();
trans.Commit();
}
DbTrans.From<T>() 回傳共用同一連線/交易的查詢物件,確保讀取一致性。
using 寫法,簡潔且安全。Hxj.Data 交易 API 以簡單實用為核心,滿足 90% 以上業務場景,複雜分散式交易建議改用 System.Transactions.TransactionScope。