コードでトランザクションをどのように使用していますか?C#でトランザクションを処理する一般的な方法
古い良い方法は、そのようなことやってました。
try
{
IDbTransaction tx = Connection.BeginTransaction();
perform_work1
perform_work2
perform_work3
tx.Commit();
}
catch(DbException)
{
tx.Rollback();
throw;
}
をしかし、その後、あなたはあなたのソフトウェアにDbExceptinロギングを追加したいことを実現し、かつ、取引関連のコードのいずれかの外観を置き換える必要があります。
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を再発明だと思う:
最初のアイデアは、これにsomethigが同様にすることです。 トランザクションメカニズムをカプセル化していない良いコードの例を挙げてください。
ソリー私の英語です。
これは実際に私が過去にこの問題をどのように解決したかと非常によく似ています。 –
トランザクションをロールバックするときにDataExceptionを記録するのはなぜですか? – msarchet
ちょうど、ちょうど、あなたの 'ResultativeAction'デリゲートと同じ定義を持つ.NET 3.0の 'Func 'デリゲートが既にあります。 –