使用原子事务的方案

下面的方案描述了原子事务的使用。

方案 1:使用 COM+ ServicedComponent 的原子事务

以下业务流程演示如何将 RetryTransactionException 与原子事务配合使用。 尽管无法为原子作用域直接包括异常处理程序,但该作用域可以包括可具有异常处理程序的非事务性作用域。 ServicedComponent 在同一 DTC 事务中登记,组件引发的任何异常都将捕获并重新引发为 RetryTransactionException。 (这假定将原子范围) 的 Retry 属性设置为 True

请注意,业务流程已暂停,即使未引发 RetryTransactionException,MessageAssignment 形状中的操作也会回滚。 但是,这种模式能够在自动进行重试的应用程序中提供一定的弹性。

具有 COM+ ServicedComponent 的原子事务

使用 COM+ ServicedComponent 的原子事务

方案 2:将事务处理适配器与原子事务配合使用

下面的业务流程显示如何将原子事务与 SQL 适配器一起使用。 对于两个逻辑工作,整个业务流程将标记为使用单个原子事务运行:为客户插入新的客户和插入订单详细信息。

如果由于某种原因导致插入订单的操作失败,则应回滚插入客户的操作。 该示例使用 SQL 适配器执行数据库工作。 如前所述,消息发送到 MessageBox 数据库时将完成与原子事务相关联的作用域。 这表示引擎在 Scope_InsertCustomer 和 Scope_InsertOrder 作用域中成功发送消息后,将提交每一作用域。 SQL 适配器将为客户或订单的实际插入创建一个新事务。

这些端口具有“送达通知”属性,用来验证是否通过发送端口成功发送了消息。 将“送达通知”属性设置为“已传输”时,会在发送操作的事务性提交点之前放置一个接收订阅。 但是在原子作用域的情况下,会将接收订阅放在封闭的父作用域中。

在 InsertOrder SQL 事务失败的情况下,将发送回“Nack”并提交“Scope_InsertOrder”。 发送端口用尽所配置的重试次数后,将引发 DeliveryFailureException。 将运行默认补偿过程的默认异常处理程序会捕获此异常。 这将调用与 Scope_InsertCustomer 和 Scope_InsertOrder 相关联的补偿处理程序,从而导致撤销插入客户信息的操作。

注意

将两个作用域嵌套在长期作用域中并从长期作用域的异常处理程序中调用补偿形状(以长期事务为目标),可产生与上述做法相同的行为。 不能将整个业务流程标记为原子的,这是因为原子事务不允许嵌套的事务。

具有原子事务的事务适配器

具有原子事务的事务处理适配器