У Джувала Лоуи есть отличная статья в MSDN под названием « Управляющие энергозависимыми ресурсами в .NET, доводите транзакции до общего типа », объясняющая, как создавать транзакционные оболочки для типов в памяти.
В своей основе вы хотите реализовать интерфейс ISinglePhaseNotification
. После того, как вы реализовали это для типа в памяти, который вы хотите участвовать в транзакции, вы должны зарегистрировать его, вызвав EnlistVolatile
метод в Transaction
классе зарегистрировать экземпляр для уведомления о транзакции.
Как правило, вы можете позвонить на EnlistVolatile
, посмотрев, является ли статическое Transaction.Current
свойство ненулевым, и, если это не так, зарегистрироваться с этим (например, это то, что классы в System.Data.SqlClient
пространстве имен делают для самостоятельной регистрации).
Однако вы можете зачислять свои экземпляры в любое удобное вам место, если знаете, что Transaction
находится на месте (например, после создания TransactionScope
).
Если вы не хотите проходить через вышеперечисленное, вы также можете подписаться на TransactionCompleted
событие и изменить состояние ваших переменных памяти в зависимости от состояния Transaction
, возвращаемого через Transaction
свойство в TransactionEventArgs
, переданное в обработчик событий.
Вы можете получить TransactionInformation
экземпляр через TransactionInformation
свойство в Transaction
. Класс TransactionInformation
имеет свойство Status
, которое возвращает значение из перечисления TransactionStatus
, указывающее состояние транзакции (подтверждено, прервано и т. Д.).