C # - System.Transactions.TransactionScope - PullRequest
14 голосов
/ 16 февраля 2010

Мне было интересно узнать о классе TransactionScope.

По большей части, я предполагаю, что он был предназначен для соединений с базой данных (для этого я и использовал его).

Мой вопрос, можете ли вы поместить любой код в блок использования TransactionScope, чтобы сделать его транзакционным? В документации MS по этому вопросу нет ясности.

Если его можно использовать для транзакционного кода, отличного от соединений с базой данных, какие из них поддерживаются? Мне показалось бы безумием, если бы это могло сделать транзакции System.IO.File транзакционными.

Ответы [ 2 ]

13 голосов
/ 16 февраля 2010

TransactionScope предназначен не только для баз данных. Каждый компонент, который реализует интерфейс IEnlistmentNotification, может участвовать в двухфазной фиксации области транзакции.

Вот пример транзакционного хранения в памяти: http://www.codeproject.com/KB/dotnet/Transactional_Repository.aspx

Кроме того, я не уверен, есть ли в .NET компоненты для ввода-вывода транзакционного файла, но реализовать такой компонент довольно просто - последние версии ОС, такие как Vista и Windows Server 2008, поддерживают ввод-вывод файла транзакций.

6 голосов
/ 16 февраля 2010

Нет, вы не можете сделать произвольный код транзакционным, запустив его внутри TransactionScope.

Как вы отметили в комментарии, пространство имен System.Transactions предоставляет классы инфраструктуры, помогающие сделать любой ресурс транзакционным .По умолчанию .NET обеспечивает поддержку диспетчера ресурсов для нескольких видов операций, перечисленных в введенном вами пространстве имен (в комментарии): «SQL Server, ADO.NET, MSMQ и координатор распределенных транзакций Microsoft (MSDTC)».

Оказывается, есть поддержка транзакций файловой системы - хотя я мог найти ее только для NTFS ( Расширение ваших приложений с помощью транзакций файловой системы ).Однако за мои деньги этот код мог бы серьезно использовать фасад.;) Возможно, существуют другие, более обобщенные реализации (или, возможно, нет - для создания файлового IO-транзакций может потребоваться дополнительная инфраструктура, предоставляемая NTFS).

Существует также немало текущих исследований по внесению изменений впамять состояния транзакции, называемая программная транзакция памяти .Microsoft DevLabs предлагает реализацию: STM.NET .

...