Vous pouvez essayer d'utiliser la classe TransactionScope de l'espace de noms System.Transactions de .NET 2.0. Cette classe vous permet de spécifier un délai après lequel la transaction sera automatiquement annulée et annulée. ADO.NET dans 2.0+ .NET est TransactionScope conscient, et adhéreront automatiquement une DbTransaction dans le champ d'application si l'on est présent au moment où la base de données est appelée:
public void DoSomething()
{
using (TransactionScope scope = new TransactionScope(TransactionScopeOptions.Required, TimeSpan.FromSeconds(60)))
{
MyDac();
scope.Complete(); // If timeout occurrs, this line is never hit, scope is disposed, which causes rollback if Complete() was not called
}
}
public class MyDac()
{
using (SqlConnection ...)
{
using (SqlCommand ...)
{
// Do something with ADO.NET here...it will autoenroll if a transaction scope is present
}
}
}
TransactionScope crée une System.Transactions.Transaction interne, qui autorise par défaut les transactions allégées vers SQL Server si un seul serveur est impliqué. Si plusieurs serveurs ou gestionnaires de ressources distribués sont impliqués dans la transaction, la transaction encapsulée par TransactionScope sera promue dans une transaction distribuée, ce qui nécessitera la coordination de MSDTC, ce qui peut compliquer l'utilisation de TransactionScope. Si toutes vos transactions sont allégées, TransactionScope peut offrir de nombreux avantages sur la gestion manuelle de vos transactions db.
J'aimerais pouvoir passer facilement aux transactions côté serveur. J'ai 500 procédures stockées jumelées avec une couche d'accès aux données ADO.NET générée par code. La plupart des invocations transactionnelles ont été ajoutées comme standard. – MatthewMartin