TransactionScope и многопоточность
Мне было интересно, как правильно использовать класс TransactionScope, когда вы имеете дело с многопоточным процессом?
Мы создаем новую область в нашем основном потоке, а затем мы создаем пару рабочих потоков, и мы хотим, чтобы они участвовали в основной области, так что, например, rollback вызывается для каждого рабочего, если область действия никогда не завершается.
Я прочитал кое-что о TransactionScope с использованием ThreadStaticAttribute, который сделал невозможным/очень сложным - мог ли кто-нибудь проверить в любом случае? Если мы закончим код в синхронном режиме, тогда откаты будут работать, то есть внутренние транзакции смогут участвовать в основной транзакции, но не если мы перейдем к поточному исполнению.
Спасибо
Ответы
Ответ 1
См. MSDN:
Вы также должны использовать TransactionScope и Класс DependentTransaction для приложения, требующие использования одна и та же транзакция по нескольким вызовы функций или несколько потоков вызовы.
Поэтому, возможно, посмотрите на DependentTransaction
- в частности, есть пример рабочего потока, здесь.
Ответ 2
Это правильно: класс TransactionScope
использует свойство Transaction.Current
, которое сохраняет его значение в поле, которое помечено атрибутом ThreadStatic
.
Атрибут ThreadStatic
гарантирует, что значение поля получает сходство потоков, то есть оно имеет уникальное значение в каждом потоке. Это рекомендуемый подход для обмена датой в потоке. Он также известен как Thread Local Storage (TLS).
Класс TransactionScope
просто определяет контекст транзакции в текущем потоке. Это не значит, что ваш код должен выполнить всю работу в этом потоке. Я мог представить себе комплексный алгоритм вычисления, который использует несколько потоков.