J'essaye de créer un System.EnterpriseServices.ServicedComponent afin de participer à une transaction distribuée. Ma principale méthode ressemble à ceci:Comment détecter un abandon de transaction dans un composant Serviced?
public void DoSomething()
{
try
{
// do something useful
// vote for commit
if (ContextUtil.IsInTransaction)
ContextUtil.MyTransactionVote = TransactionVote.Commit;
}
catch
{
// or shoud I use ContextUtil.SetAbort() instead?
if (ContextUtil.IsInTransaction)
ContextUtil.MyTransactionVote = TransactionVote.Abort;
throw;
}
}
Ce que je suis en train de faire est de détecter si la transaction distribuée a été annulée (ou annulée), puis passez à rollback mes changements. Par exemple, j'ai peut-être créé un fichier sur le disque ou fait des effets secondaires qui doivent être annulés.
J'ai essayé de gérer l'événement SystemTransaction.TransactionCompleted ou inspecté l'état du SystemTransaction dans la méthode Dispose() sans succès.
Je comprends que ce qui est similaire à la « compensation » plutôt que de « transaction ».
Est-ce que ce que j'essaie de faire a même du sens?
Eh bien, répondre genre de ma propre question, cela est possible en dérivant la ServicedComponent de System.Transactions.IEnlistmentNotification ainsi. Cependant, je n'arrivais pas à faire fonctionner ceci - plutôt, j'ai systématiquement obtenu une exception ObjectDisposedException. –