Транзакция между базой данных и задачей памяти? - PullRequest
2 голосов
/ 02 сентября 2011

Я хочу сделать какую-то работу в базе данных, затем какую-нибудь задачу в памяти (например, изменить некоторые значения объектов), и я хочу объединить обе задачи в одной транзакции.

Я использую EF 4.1, и он просто предоставляет мне метод SaveChanges, который сам выполняет транзакцию. Просто если SaveChanges не выбрасывает исключение, я могу выполнить какое-то задание на память. Это решение. Но это нарушает архитектуру приложения. Потому что SaveChanges не вызывается перед этой задачей. Задача может не знать, что SaveChanges будет успешным или неуспешным в будущем, когда она вызывается.

Можно ли выполнить какую-либо транзакцию между задачами базы данных и памяти?

Если это так, то как мы можем это сделать?

1 Ответ

3 голосов
/ 02 сентября 2011

У Джувала Лоуи есть отличная статья в MSDN под названием « Управляющие энергозависимыми ресурсами в .NET, доводите транзакции до общего типа », объясняющая, как создавать транзакционные оболочки для типов в памяти.

В своей основе вы хотите реализовать интерфейс ISinglePhaseNotification . После того, как вы реализовали это для типа в памяти, который вы хотите участвовать в транзакции, вы должны зарегистрировать его, вызвав EnlistVolatile метод в Transaction классе зарегистрировать экземпляр для уведомления о транзакции.

Как правило, вы можете позвонить на EnlistVolatile, посмотрев, является ли статическое Transaction.Current свойство ненулевым, и, если это не так, зарегистрироваться с этим (например, это то, что классы в System.Data.SqlClient пространстве имен делают для самостоятельной регистрации).

Однако вы можете зачислять свои экземпляры в любое удобное вам место, если знаете, что Transaction находится на месте (например, после создания TransactionScope).

Если вы не хотите проходить через вышеперечисленное, вы также можете подписаться на TransactionCompleted событие и изменить состояние ваших переменных памяти в зависимости от состояния Transaction, возвращаемого через Transaction свойство в TransactionEventArgs, переданное в обработчик событий.

Вы можете получить TransactionInformation экземпляр через TransactionInformation свойство в Transaction. Класс TransactionInformation имеет свойство Status , которое возвращает значение из перечисления TransactionStatus , указывающее состояние транзакции (подтверждено, прервано и т. Д.).

...