Компенсация
Компенсация в WF — это механизм, с помощью которого можно отменить или компенсировать выполненные ранее действия (в соответствии с логикой, определенной приложением), если они привели к возникновению ошибки. Транзакции позволяют объединить несколько операций в одну единицу работы. Использование транзакции дает приложению возможность прерывать (откатывать) все изменения, выполненные в транзакции, если во время какой-либо части обработки транзакции возникнет ошибка. Однако использование транзакций может быть неприемлемо, если работа является долговременной. Пусть, например, приложение планирования путешествия реализовано как рабочий процесс. Шагами рабочего процесса могут быть заказ авиабилетов, ожидание подтверждения диспетчера и, наконец, оплата билетов. Этот процесс может занять несколько дней, и включение шагов заказа и оплаты авиабилетов в одну транзакцию непрактично. В этом сценарии, если позднее в процессе обработки произойдет какая-нибудь ошибка, то для отмены шага заказа в рабочем процессе можно будет использовать компенсацию.
Использование компенсации
Когда рабочий процесс содержит действия, выполняющие логику, которую необходимо отменить или компенсировать в случае, если рабочий процесс завершится ошибкой, а транзакции не будут соответствовать логике, то эти действия можно поместить в действие CompensableActivity. Действие CompensableActivity содержит несколько разделов дочерних действий, включая Body и ConfirmationHandler. Действие Body определяет компенсируемую единицу бизнес-логики, которая запускается во время обычного выполнения рабочих процессов, а действие CompensationHandler определяет единицу логики, которая компенсирует работу, выполненную при помощи Body. При вызове компенсации явным образом при помощи действия Compensate либо неявным образом при помощи логики компенсации рабочего процесса по умолчанию будет выполнено действие, заданное в качестве свойства CompensationHandler, компенсируя выполнение действий Body. Если действие CompensationHandler не предоставлено, запускается логика компенсации по умолчанию, компенсируя все действия CompensableActivity, вложенные в тело Body, которое было успешно выполнено в Body в обратном порядке завершения. Дополнительные сведения о компенсации см. в разделе Модель программирования компенсации.