С# - 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.