코드에서 트랜잭션을 어떻게 사용하고 있습니까? 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();
}
);
그리고 나는 내가 여기에 자전거 환승을 개혁하고 있다고 생각 :
첫 번째 아이디어는이에 대한 somethig에 비슷한 만드는 것입니다. 트랜잭션 메커니즘을 캡슐화하지 않은 좋은 코드의 예를 제공하십시오.
Sory for my English.
이것은 실제로 이전에이 문제를 해결 한 방법과 매우 유사합니다. –
왜 트랜잭션을 롤백 할 때 DataException을 기록하지 않습니까? – msarchet
참고로, .NET 3.0에는 이미 'Func'델리게이트가 있는데, 이는 'ResultativeAction '델리게이트와 동일한 정의입니다. –