1、描述
事务子流程是一个嵌入式子流程,可用于将多个活动分组到一个事务中。交易是一个合乎逻辑的工作单元,它允许将一组单独的活动分组,以使它们共同成功或失败。
交易的可能结果:交易可以有三种不同的结果:
- 如果交易没有被取消或被危险终止,那么交易是成功的。如果事务子进程成功,则使用传出序列流保留它。如果在过程中稍后发生补偿事件,则成功的交易可能会得到补偿。注:与“普通”嵌入子流程一样,交易可以在成功完成后使用中间投掷赔偿事件来补偿。
- 事务是取消如果执行到达取消结束事件。在这种情况下,所有的执行都被终止并被删除。然后剩余的一个执行被设置为取消边界事件,这会触发补偿。补偿完成后,事务子进程保留使用取消边界事件的输出序列流。
- 如果一个错误事件被抛出,并没有被包含在事务子过程的范围内,事务就会以危险结束。如果在事务子过程的边界上捕获错误,这也适用。在这些情况下,不会执行赔偿。
下图说明了三种不同的结果:
与ACID交易的关系:不要将BPMN交易子流程与技术(ACID)交易混淆。BPMN交易子流程不是范围技术交易的一种方式。为了理解Flowable中的事务管理,请阅读并发和事务部分。BPMN交易与以下方面的技术交易不同:
- 虽然ACID交易通常是短暂的,但BPMN交易可能需要几小时,几天甚至几个月才能完成。考虑一个事务分组的事件之一是用户任务:通常人们的响应时间比应用程序长。或者,在另一种情况下,BPMN事务可能会等待某个业务事件发生,例如特定的订单已经完成。这样的操作通常要比在数据库中更新记录或使用事务队列存储消息花费更长的时间。
- 由于不可能将技术事务范围限定在业务活动期间,所以BPMN事务通常跨越多个ACID事务。
- 由于BPMN事务处理涉及多个ACID事务,所以我们放弃了ACID属性。例如,考虑上面给出的例子。假设“书酒店”和“收费信用卡”操作是在单独的ACID交易中执行的。我们还假设“图书酒店”活动是成功的。现在我们有一个中介不一致的状态,因为我们已经进行了酒店预订,但还没有收取信用卡。现在,在一个ACID事务中,我们也会依次执行不同的操作,因此也有一个中介不一致的状态。这里的不同之处在于,不一致的状态在交易范围之外是可见的。例如,如果使用外部预订服务进行预订,使用相同预订服务的其他方可能已经看到该酒店被预订。这意味着,在实现业务事务时,我们完全放弃了隔离属性(我们通常在处理ACID事务时也放松隔离,以实现更高级别的并发性,但是我们有细粒度的控制和中介不一致性,短时间)。
- BPMN业务事务不能从传统意义上回滚。由于它横跨多个ACID事务,所以这些ACID事务中的一些可能在BPMN事务被取消时已经被提交。在这一点上,他们不能回滚了。
由于BPMN事务本质上是长期运行的,所以缺乏隔离和回滚机制需要以不同的方式处理。在实践中,通常没有更好的解决方案,而是以特定于领域的方式处理这些问题:
- 回滚是使用补偿来执行的。如果在事务范围内引发取消事件,则所有成功执行并具有补偿处理程序的活动的效果将得到补偿。
- 缺乏隔离也经常使用领域特定的解决方案来处理。例如,在上面的例子中,在我们确定第一个客户可以付钱之前,酒店房间可能会被预订给第二个客户。由于从商业角度来看这可能是不可取的,预订服务可能会选择允许超额预订。
- 此外,由于交易在危险情况下可以中止,预订服务必须处理预订旅馆房间的情况,但是从不尝试付款(因为交易被中止)。在这种情况下,预订服务可以选择一种策略,即在最长时间内预留酒店房间,并且如果当时没有收到付款,则预订被取消。
综上所述:虽然ACID事务为这些问题(回滚,隔离级别和启发式结果)提供了一个通用的解决方案,但在实现业务事务时,我们需要为这些问题找到针对特定领域的解决方案。
目前的限制:
- BPMN规范要求流程引擎对底层事务协议发出的事件作出反应,例如,如果在底层协议中发生取消事件,事务就会被取消。作为嵌入式引擎,Flowable目前不支持这一功能。有关这方面的一些后果,请参阅下面关于一致性的段落。
在ACID事务和乐观并发之上的一致性:BPMN交易可以保证一致性,即所有活动都能够成功竞争,或者某些活动无法执行,所有其他成功活动的效果都会得到补偿。所以,无论哪种方式,我们最终都处于一致的状态。但是,重要的是要认识到,在Flowable中,BPMN事务的一致性模型叠加在流程执行的一致性模型之上。Flowable以事务处理的方式执行进程。并发性使用乐观锁定来解决。在Flowable中,BPMN错误,取消和补偿事件建立在相同的ACID事务和乐观锁定之上。例如,取消结束事件只有在实际到达时才能触发补偿。如果之前有一个服务任务抛出了一些未声明的异常,那么还没有达到。要么,如果基础ACID事务中的其他参与者将事务设置为只回滚状态,则无法提交补偿处理程序的效果。或者,当两个并发执行达到取消结束事件时,可能会触发两次补偿,并以乐观锁定异常失败。所有这一切都是说当在Flowable中实现BPMN事务时,同样的一套规则适用于实现“普通”进程和子进程。因此,为了有效保证一致性,以考虑到乐观的事务执行模型的方式来
实现流程是非常重要的。当两个并发执行达到取消结束事件时,可能会触发两次补偿,并以乐观锁定异常失败。所有这一切都是说当在Flowable中实现BPMN事务时,同样的一套规则适用于实现“普通”进程和子进程。因此,为了有效保证一致性,以考虑到乐观的事务执行模型的方式来实现流程是非常重要的。当两个并发执行达到取消结束事件时,可能会触发两次补偿,并以乐观锁定异常失败。所有这一切都是说当在Flowable中实现BPMN事务时,同样的一套规则适用于实现“普通”进程和子进程。因此,为了有效保证一致性,以考虑到乐观的事务执行模型的方式来实现流程是非常重要的。
2、图形表示法
一个事务子过程可视化为一个嵌入式子过程,带有两个轮廓。
3、XML表示
事务子流程使用transaction标签以XML表示:
<transaction id="myTransaction" >
...
</transaction>
以下是一个交易子流程的例子:
上面文章来自盘古BPM研究院:http://vue.pangubpm.com/
文章翻译提交:https://github.com/qiudaoke/flowable-userguide
了解更多文章可以关注微信公众号: