TransactionScope и многопоточность - PullRequest
42 голосов
/ 23 марта 2009

Мне было интересно, как правильно использовать класс TransactionScope при работе с многопоточностью?

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

Я прочитал кое-что о TransactionScope, используя внутренний атрибут ThreadStaticAttribute, что сделало вышеперечисленное невозможным / очень трудным - кто-то может проверить в любом случае? Если мы выполняем код синхронизированным образом, то откаты работают, то есть внутренние транзакции могут участвовать в основной транзакции, но не в том случае, если мы переключаемся на многопоточное выполнение.

Спасибо

Ответы [ 2 ]

29 голосов
/ 23 марта 2009

См. MSDN :

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

Так что, возможно, посмотрите на DependentTransaction - в частности, есть пример рабочего потока, здесь .

18 голосов
/ 23 марта 2009

Это правильно: класс TransactionScope использует свойство Transaction.Current, которое хранит его значение в поле, которое помечено атрибутом ThreadStatic.

Атрибут ThreadStatic гарантирует, что значение поля получает сходство с потоком, т. Е. Имеет уникальное значение в каждом потоке. Рекомендуется использовать дату в ветке. Он также известен как Локальное хранилище потоков (TLS).

Класс TransactionScope просто определяет контекст транзакции в текущем потоке. Это не значит, однако, что ваш код должен выполнять всю работу в этом потоке. Я мог бы представить сложный алгоритм расчета, который использует несколько потоков.

...