任何數據操作都應包裹在事務中,即使是查詢。本文建立標準事務模板,並演示使用 TestDriven.NET + NCover 進行代碼覆蓋率分析的實戰技巧。
using (ITransaction tx = _session.BeginTransaction())
{
try
{
// CRUD 操作
tx.Commit();
}
catch (HibernateException)
{
tx.Rollback();
throw;
}
}
關鍵點:
using 確保事務資源釋放try-catch 捕獲異常執行回滾_session.Flush() 同步內存狀態到資料庫(Commit 前自動觸發,顯式調用可提前發現錯誤)public int CreateCustomerTransaction(Customer customer)
{
using (ITransaction tx = _session.BeginTransaction())
{
try
{
int newId = (int)_session.Save(customer);
_session.Flush();
tx.Commit();
return newId;
}
catch (HibernateException)
{
tx.Rollback();
throw;
}
}
}
public void DeleteCustomerTransaction(Customer customer)
{
using (ITransaction tx = _session.BeginTransaction())
{
try
{
_session.Delete(customer);
_session.Flush();
tx.Commit();
}
catch (HibernateException)
{
tx.Rollback();
throw;
}
}
}
public void UpdateCustomerTransaction(Customer customer)
{
using (ITransaction tx = _session.BeginTransaction())
{
try
{
_session.Update(customer);
_session.Flush();
tx.Commit();
}
catch (HibernateException)
{
tx.Rollback();
throw;
}
}
}
public void SaveOrUpdateCustomersTransaction(IList<Customer> customers)
{
using (ITransaction tx = _session.BeginTransaction())
{
try
{
foreach (Customer c in customers)
_session.SaveOrUpdate(c);
_session.Flush();
tx.Commit();
}
catch (HibernateException)
{
tx.Rollback();
throw;
}
}
}
[Test]
public void CreateCustomerTransactionTest()
{
var customer = new Customer { Firstname = "YJing", Lastname = "Lee" };
int newIdentity = _transaction.CreateCustomerTransaction(customer);
var testCustomer = _transaction.GetCustomerById(newIdentity);
Assert.IsNotNull(testCustomer);
}
CreateCustomerTransaction 方法 100% 覆蓋,執行路徑:Save → Flush → Commit → Return[Test]
[ExpectedException(typeof(HibernateException))]
public void CreateCustomerThrowExceptionOnFailTest()
{
var customer = new Customer
{
Firstname = "012345678901234567890123456789012345678901234567890123456789", // 超長觸發截斷錯誤
Lastname = "YJingLee"
};
_transaction.CreateCustomerTransaction(customer);
}
| 場景 | 事務必要性 | 關鍵操作 |
|---|---|---|
| 單條寫入 | 必須 | Save + Flush + Commit |
| 批量寫入 | 必須 | 循環 SaveOrUpdate + Flush + Commit |
| 查詢/延遲加載 | 必須 | 保證 Session 開啟、隔離級別 |
| 跨多個 DAO 方法 | 必須 | 上層協調事務邊界(Service 層) |
事務是數據一致性基石,NHibernate 強制事務設計體現嚴謹工程觀。結合 NCover 覆蓋率分析,可量化驗證正常與異常路徑完整覆蓋。下篇將深入並發控制機制。