Подтвердить что ты не робот

TransactionScope и многопоточность

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

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

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

Спасибо

4b9b3361

Ответ 1

См. MSDN:

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

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

Ответ 2

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

Атрибут ThreadStatic гарантирует, что значение поля получает сходство потоков, то есть оно имеет уникальное значение в каждом потоке. Это рекомендуемый подход для обмена датой в потоке. Он также известен как Thread Local Storage (TLS).

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