Как вы используете транзакции в своем коде?
Старый добрый способ состоял в том, чтобы сделать что-то подобное:
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();
}
);
И я думаю, что я заново изобретаю велосипед здесь.
Пожалуйста, приведите пример хорошего кода, который инкапсулирует механизм транзакций,
Извините за мой английский.