广东广州快速网站制作企业如何做视频网站首页
2026/4/18 3:12:41 网站建设 项目流程
广东广州快速网站制作企业,如何做视频网站首页,招聘海报制作软件app免费,哪两个数字域名是做医疗信息网站的我们在开发的过程中#xff0c;如果一个业务操作需要本地写MYSQL数据以及对第三方系统做写操作#xff0c;那么这种流程就涉及到分布式系统一致性的问题#xff0c;然而并非所有系统都能使用成熟的分布式事务方案PS:示例代码推送到#xff1a;https://gitee.com/dailycreat…我们在开发的过程中如果一个业务操作需要本地写MYSQL数据以及对第三方系统做写操作那么这种流程就涉及到分布式系统一致性的问题然而并非所有系统都能使用成熟的分布式事务方案PS:示例代码推送到https://gitee.com/dailycreatebug/demo-codes案例说明以一个财务报账业务为例涉及到的系统如下系统名作用实现方案单据系统申请单内容以及凭证的生成JAVABPM实现流程的运转购买成熟系统例如泛微SAP财务凭证购买成熟系统详细解释下各系统作用单据系统财务报账会提交很多信息例如报账事由、报账金额与明细。同时也会生成财务凭证不了解凭证也没关系它就是给财务人员看的东西对技术人员来说就是数据库的一堆数据BPM系统非常成熟的流程管理系统以非常直观的方式来实现流程的搭配不了解的可以自行百度扫盲。在此案例中需要使用BPM的两个能力1调用API审核通过 2调用API获取流程的待审人SAP系统财务专用系统不用过多了解只要知道在财务审核完成后会将单据系统生成的凭证数据通过API调用的方式发送给SAP即可“审核通过”业务流程当审核人员审核通过时大致流程如下保存业务数据记录审核日志调用BPM接口审核通过调用BPM接口获取最新待审人如果没有待审人说明已经审完生成凭证并推送SAP代码如下风险分析如图所示如果在1和2出现异常由于有事务的存在操作1内的几条mysql写操作会被回滚因此所有数据都没有任何变化。但如果1和2正常执行操作3发生异常操作1的数据会因为事务回滚但操作2并不能。因此整个系统会出现一个很诡异的现象单据系统内没有任何日志记录用户操作的数据也没有保留下来但BPM那边却已经审核通过了这在任何正常流程中都是不可能出现的状态。对于用户而言他在页面会收到报错然后可能会再次点击“审核通过”而此时BPM那边却显示流程已经走到下一个节点该用户无权限操作。问题分析根本原因其实不难因为MYSQL事务只能管他自己没法控制第三方系统解决思路一个字拆对于分布式系统没有任何人能保证远程调用不出问题因此在做设计时就必须能够对这种情况做出应对上面的操作打包放进一个大事务就是根因因此方案就是将大事务拆开在拆分时需要遵循以下几个原则小事务内尽量只有一个远程写操作该远程写操作放到方法最后保证在其返回成功后就能立刻提交事务小事务可能会因为某些原因失败因此需要机制来进行重试整体思路就是这样基于以上原则改动如下第一步新建一张任务表CREATETABLEtransaction_job ( idbigint(20) NOTNULL AUTO_INCREMENT COMMENT主键, typevarchar(255) NOTNULLCOMMENT任务类型, datavarchar(255) NOTNULLCOMMENT任务数据, error_messagevarchar(255) DEFAULTNULLCOMMENT错误信息, contextvarchar(255) DEFAULTNULLCOMMENT任务上下文主要是保存当前操作人, create_timebigint(20) NOTNULLCOMMENT创建时间, update_timebigint(20) NOTNULLCOMMENT更新时间, retry_timesint(11) NOTNULLDEFAULT0COMMENT重试次数, PRIMARY KEY (id) ) ENGINEInnoDBDEFAULTCHARSETutf8mb4 COMMENT事务任务表;作用保存小事务的关键数据到data字段中以保证通过该字段就能正确执行小事务。另外也需要保存当前操作人的信息context。第二步通过定时任务查出transaction_job表中未完成的数据并执行对应的操作这里通过简单的策略模式将框架代码和业务代码做了分离首先是框架代码核心逻辑扫描任务执行任务这是一个策略模式接口每个小事务就封装一个独立的实现类其中更新待审人的任务实现如下其实就是把那部分代码复制过来第三步改造业务代码不再一次性把流程写完而且是在第一个小事务中顺便往transaction_job中插入一条数据以执行第二个小事务其中步骤2插入任务数据的代码的具体实现如下(transactionJobService.create)优化上述方案种除第一个事务外后续事务都是通过定时任务来执行的因此这些事务都存在一定的延迟用户体验不好解决办法也非常简单只需要利用好Spring对于事务的生命周期管理稍微改造一下插入任务的方法transactionJobService.create这是Spring提供的工具类afterCommit()方法会在事务提交后执行因此加上这段代码后思路就变成了这样如果小事务顺利执行会立刻将该任务改为“成功”因此从用户端是感受不到延迟的注意可能存在添加任务后定时任务也立刻扫描到了这条数据同一任务就会被主线程与定时任务线程同时执行所以实际应用中需要考虑这个问题比如加锁再执行执行前再检查数据库状态结语目前只给出了解决思路的核心但真实项目中还添加了不少额外功能以后会逐渐更新进来

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询