您如何在代碼中使用事務?在C中處理事務的常用方式#
舊的好辦法是做這樣的事情:
try
{
IDbTransaction tx = Connection.BeginTransaction();
perform_work1
perform_work2
perform_work3
tx.Commit();
}
catch(DbException)
{
tx.Rollback();
throw;
}
但後來你意識到你要DbExceptin記錄添加到您的軟件,並且應該更換的交易相關的代碼什麼樣子。
第一個想法是讓somethig與此類似:
public static class SafeCallerProxy
{
public delegate T ResultativeAction<T>();
public static T ExecuteWithResult<T>(IDbConnection conn, ResultativeAction<T> action)
{
using(IDbTransaction tx = conn.BeginTransaction())
{
try
{
T result = action();
tx.Commit();
return result;
}
catch (System.Data.DataException)
{
tx.Rollback();
throw;
}
}
}
public static void ExecuteAction(IDbConnection conn, Action action)
{
using (IDbTransaction tx = conn.BeginTransaction())
{
try
{
action();
tx.Commit();
}
catch (System.Data.DataException)
{
tx.Rollback();
throw;
}
}
}
}
使用
SafeCallerProxy.ExecuteAction(connection,() =>
{
DoWork1();
DoWork2();
DoWork3();
}
);
而且我覺得我在這裏重塑bycicle。 請給出一個包含交易機制的好代碼的例子,
Sory爲我的英文。
這實際上與我過去解決這個問題的方式非常相似。 – 2010-11-19 18:35:06
爲什麼不在回滾事務時記錄DataException? – msarchet 2010-11-19 18:36:12
僅供參考,在.NET 3.0中已經有一個'Func'委託,它的定義與您的'ResultativeAction '代表具有相同的定義。 –
2010-11-19 18:38:57