Transactions 长时间运行的事务结构化方法

Transactions 长时间运行的事务结构化方法,transactions,xa,Transactions,Xa,我正在寻找一种结构化的方法来处理长时间运行(数小时或更长时间)的事务。如前所述,这些类型的交互通常由乐观锁定和手动合并策略处理 使用标准事务对这类问题采用更结构化的方法是非常方便的。各种长时间运行的交互,如用户注册、订单确认等,都有类似于事务的语义,并且发明自己脆弱的手动回滚和/或超时/清理策略既容易出错,又繁琐 以RDBMS为例,我意识到保持所有事务的开放性将是一个主要的性能成本。作为替代方案,我可以想象一个数据库同时支持两个隔离级别/策略,一个用于短时间运行,另一个用于长时间运行的对话。例如

我正在寻找一种结构化的方法来处理长时间运行(数小时或更长时间)的事务。如前所述,这些类型的交互通常由乐观锁定和手动合并策略处理

使用标准事务对这类问题采用更结构化的方法是非常方便的。各种长时间运行的交互,如用户注册、订单确认等,都有类似于事务的语义,并且发明自己脆弱的手动回滚和/或超时/清理策略既容易出错,又繁琐

以RDBMS为例,我意识到保持所有事务的开放性将是一个主要的性能成本。作为替代方案,我可以想象一个数据库同时支持两个隔离级别/策略,一个用于短时间运行,另一个用于长时间运行的对话。例如,长时间运行的会话可能会对数据访问有更严格的限制,以便于它们花费更多的时间(某些数据的只读语义、乐观锁定语义等)


有什么解决方案可以做类似的事情吗?

我宁愿使用BPM工具来完成这类事情,因为有明确的目的是支持长时间运行的业务流程。我不能详细说明,但建议检查一下。我引用了以下部分,但整篇文章值得一读:

管理编排的状态

两者最大的区别之一是 编排和业务 它使用的服务是每个服务的时间 执行需要时间。请求 典型服务生成应答 几秒钟之内。因为它 通常驱动全部或部分驱动器 然而,业务流程是 编排可以运行数小时、数天, 或几周,取决于 这一过程需要很长时间才能完成。如果…怎么办 在某些情况下需要人工批准 例如,在这个过程中, 还有那个必须给她的人 你在度假吗?因为 业务流程可能需要很长时间 是时候完成了,编排 控制它们也可以运行一段时间 好久不见了

这种长期运行的特性会影响 业务流程管理内存中的业务流程 它维护的信息 说明正在运行的进程。如果 业务流程已被阻止用于 重要的一段时间,保持 内存中的这种状态没有多大用处 感觉相反,BPM服务器应该 为业务流程的 要自动写入的状态 磁盘,然后在 业务流程恢复,即使 几天或几周后

国家管理说明了另一个问题 BPM服务器之间的显著差异 和应用服务器。自从 支持长期运行的业务 流程不是他们的主要目的, 应用服务器还没有 传统上是指这种 国家管理。因为他们是 明确旨在支持 然而,长期运行的编排, BPM服务器确实提供了这项服务

处理交易

许多业务流程需要 全有或全无的行为特征 通过交易。例如,一个 推动业务的协调 进程可能需要调用两个 并确保 要么两个请求都成功,要么两个都成功 失败这种原子事务 可以使用标准来完成 两阶段提交协议,并且 BPM服务器通常使用的东西 支持实际上,应用服务器 包括此功能,以便创建BPM服务器 构建在应用服务器上可以 这很容易提供

许多业务流程的性质 然而,这引发了另一个问题。如果…怎么办 一个特定的过程需要 全有或全无的行为,但一个 传统的原子事务不是 可能的原子事务需要 在数据库的生命周期内锁定数据 交易,不是一种交易 交易短时出现问题。 但假设必须提供的服务 捆绑到一个全有或全无的组中 包括一个需要人力资源的项目 批准即使要求 批准人不在休假,时间是 一个人的反应是 数据可能太长,无法保存 保持锁定。或者如果一个服务 那一定是在这个地方 组不参与原子化 交易?这不是一个牵强的问题 担心,因为很多应用程序都不会 让任意客户端锁定其数据

要处理此类情况,BPM 服务器支持长时间运行 交易。也叫生意 活动和其他名称, 长时间运行的事务处理 错误不是通过回滚所有 更新,而是通过执行一些 一种补偿逻辑,当 发生错误。例如,假设一个 特定长时间运行的事务 包括一个原子事务,该事务 从一家银行向另一家银行转账 另一个,然后是一个操作 执行另一个应用程序 转移成功了。如果这是决赛 如果操作失败,则 业务流程要求 汇款不能撤消。然而 执行此操作的原子事务 转移已承诺-如何 它能逆转吗?答案是 如果发生故障,则必须运行补偿逻辑 发生故障时,逻辑可能 执行另一个原子事务以 撤消传输的效果。A. BPM服务器提供内置的 允许 用于定义此项的编排 补偿行动,然后拥有它 长时间运行时自动执行- 运行事务失败

而补偿是有用的 原子事务是不可能的, 这不是没有问题的。假设 业务流程修改中的某些数据 长期运行的早期阶段 例如,事务,然后运行