zu arbeiten Wie verwenden Sie Transaktionen in Ihrem Code?Der übliche Weg, mit Transaktionen in C#
Der alte war guter Weg, so etwas zu tun:
try
{
IDbTransaction tx = Connection.BeginTransaction();
perform_work1
perform_work2
perform_work3
tx.Commit();
}
catch(DbException)
{
tx.Rollback();
throw;
}
Aber dann merkt man, dass Sie DbExceptin Protokollierung der Software hinzugefügt werden soll, und sollte, ersetzen jeden Anschein von transaktionsbezogenen Code.
Die erste Idee ist somethig ähnlich wie dies zu machen:
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;
}
}
}
}
Nutzung
SafeCallerProxy.ExecuteAction(connection,() =>
{
DoWork1();
DoWork2();
DoWork3();
}
);
Und ich denke, dass ich hier bin Fahrrad neu zu erfinden. Bitte geben Sie ein Beispiel für einen guten Code, der Transaktionsmechanismus einkapselt,
Sory für mein Englisch.
Das ist eigentlich sehr ähnlich wie ich dieses Problem in der Vergangenheit gelöst habe. –
Warum protokollieren Sie nicht einfach die DataException, wenn Sie die Transaktionen zurücksetzen? – msarchet
Just FYI, es gibt bereits eine 'Func' Delegat in .NET 3.0, die die gleiche Definition wie Ihre 'ResultativeAction 'Delegat hat. –