Почему неявный Persist в TransactedReceiveScope выполняется в конце, а не в начале области? - PullRequest
0 голосов
/ 29 января 2020

Когда транзакция передается в TransactedReceiveScope внутри службы рабочего процесса, среда выполнения WF4 выполняет тело внутри этой внешней транзакции. После того, как тело выполнено, оно вызывает неявное Persist в хранилище экземпляров и возвращает вызывающему. Если в этот момент транзакция отменяется на стороне вызывающей стороны, мой экземпляр рабочего процесса прерывается во время выполнения. После некоторого простоя или при следующем вызове извне он возобновляется из хранилища экземпляров.

Я предполагаю, что такое поведение мы можем ожидать. Отмена экземпляра означает откат до последней сохраняемой точки. Но я не могу понять, почему неявное сохранение не выполняется до транзакционной работы. Как это делается после тела TransactedReceiveScope, нет возможности возобновить состояние до начала транзакции.

Предположим, что внутри TransactedReceiveScope я выполняю некоторую работу с БД и дополнительно я увеличиваю переменную экземпляра Workflow. Если транзакция прерывается извне, работа БД корректно откатывается, но моя переменная сохраняет увеличенное значение. Это не имеет никакого смысла, не так ли?

Если персистентность была сделана в начале, Abort / Resume также сбросит мою переменную в исходное состояние. Но это не то, как это было реализовано разработчиками TransactedReceiveScope.

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

...