Когда транзакция передается в TransactedReceiveScope
внутри службы рабочего процесса, среда выполнения WF4 выполняет тело внутри этой внешней транзакции. После того, как тело выполнено, оно вызывает неявное Persist
в хранилище экземпляров и возвращает вызывающему. Если в этот момент транзакция отменяется на стороне вызывающей стороны, мой экземпляр рабочего процесса прерывается во время выполнения. После некоторого простоя или при следующем вызове извне он возобновляется из хранилища экземпляров.
Я предполагаю, что такое поведение мы можем ожидать. Отмена экземпляра означает откат до последней сохраняемой точки. Но я не могу понять, почему неявное сохранение не выполняется до транзакционной работы. Как это делается после тела TransactedReceiveScope
, нет возможности возобновить состояние до начала транзакции.
Предположим, что внутри TransactedReceiveScope
я выполняю некоторую работу с БД и дополнительно я увеличиваю переменную экземпляра Workflow. Если транзакция прерывается извне, работа БД корректно откатывается, но моя переменная сохраняет увеличенное значение. Это не имеет никакого смысла, не так ли?
Если персистентность была сделана в начале, Abort / Resume также сбросит мою переменную в исходное состояние. Но это не то, как это было реализовано разработчиками TransactedReceiveScope
.
Я предполагаю, что для такой реализации была веская причина. Кто-нибудь может это объяснить?