我想了解使用插件时如何提交事务。
我知道有4个主要操作 -
预验证 - 外部交易
预操作 - 内部交易
后操作(同步)-内部事务
后操作(异步)-外部事务
但是在以下场景中会发生什么:
Entity A
在后操作(同步)中注册了一个更新Entity B
的步骤。
Entity B
在后期操作(异步)中注册了一个步骤
据我了解,这两个步骤将在同一个事务中执行,即使
Entity B
的步骤被注册为异步。
这是否意味着如果
Entity B
的异步步骤中发生错误,整个事务都会回滚?包括 Entity A
的同步步骤所做的更改?
此外,如果
Entity B
也有预验证步骤怎么办? Entity A
的同步步骤触发时会跳过吗?
当 Dataverse 收到例如表记录的更新,此事件在多个阶段中传递插件管道:
主操作是系统本身执行其工作的地方。对于所有其他阶段,我们可以注册自定义处理程序(插件步骤)。
当管道接收到来自外界的更新(通过 UI 或 API)时,预验证阶段将是外部数据库事务。一般来说,在这个阶段,自定义代码可以添加验证,甚至可以动态修改记录上的字段。当发现输入无效时,自定义代码可以通过抛出异常来取消更新。
预验证阶段之后,将打开一个数据库事务,并且在预操作、主操作和后操作阶段中执行的所有数据库操作都是该事务的一部分。因此,当过程中抛出异常时,所有已完成的创建、更新和删除操作都会回滚。
当Post操作阶段完成时,事务被提交。注册异步步骤后,系统将安排一个“异步操作”事件。这是数据库事务之外的,该事件将由另一个服务拾取。您可以在asyncoperation
表中跟踪异步操作事件的处理情况。