С# - System.Transactions.TransactionScope

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

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

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

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

Ответы

Ответ 1

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

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

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

Ответ 2

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

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

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

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