Я смотрю TransactionScope и подписаться на Transaction.Current.TransactionCompleted
. Чтобы предотвратить проблемы с параллельными транзакциями, я использую Monitor. Могу ли я быть уверенным, что Transaction.Current.TransactionCompleted
будет вызываться в любом случае?
Monitor.Enter(TransactionScopeLockString);
TransactionOptions transactionOptions = new TransactionOptions();
TransactionScope result = new TransactionScope(scopeOption, transactionOptions);
Transaction.Current.TransactionCompleted += (sender, transactionEventArgs) =>
{
if (transactionEventArgs.Transaction.TransactionInformation.Status
== TransactionStatus.Aborted)
{
// clear stuff
}
Monitor.Exit(TransactionScopeLockString);
};
Это гарантировано, хотя может быть одна проблема с вашим кодом. Я помню, что событие TransactionCompleted
вызывается в другом потоке, поэтому Monitor.Exit
не работает. Вы не можете войти в монитор на одном потоке и выйти из него на другом.
Я считаю, что вы можете использовать ManualResetEvent
вместо: Monitor.Enter и Monitor.Exit в разных потоках