4种不同方法解决并发问题——自动连续编号的4种解决方案——函数触发机制分析

楼主
简道云官方指定金牌服务商
前言:
  • 这是我在帆软社区发布的第3篇博客,也是简道云原老社区的第3篇文章(最早发布于 2017-12-05),以后还有更多(技术类、管理类、理论类),为了不迷失不迷路,【请收藏这个链接集合】,以后所有博客都会汇集于此,敬请期待!
  • 并发的问题其实已经在别的文章里讨论过了,只是那里说的比较简略,不够全面,这里再次单就并发问题做深入分析,并给出利用4种不同思路的解决方案。



 

4种不同方法解决并发问题——自动连续编号的4种解决方案——函数触发机制分析



先来看下并发问题的来源。有些场景需求是要对表单提交次数或顺序做限制的,比如一定量名额的招生,或指定量问卷数据的收集,或是要求连续的单号编号等。通常用的方法是利用mapx函数跨表单调取数据的方法来解决,比如人员报名表单,利用mapx的count对姓名字段做聚合操作,即计数,以记录报名人数或顺序。但当出现多人同时填写表单时,就有可能出现聚合操作重复值的问题。

要理解上述问题,先来看下mapx函数触发的时间机制。

下图直观模拟一次完整的表单处理过程。




假定,打开表单和提交表单两种动作用时分别是1s,编辑表单用时N s。(备注:其中,打开包括新建、待办/协作;结束包括提交、暂存、回退。)

1、当表单被打开的那1 s,表单内所有设定好的函数都会参与运算并给出结果。
2、当表单被打开并展现计算结果之后,填表人处理编辑完成表单内容会需要N s,在这一段时间内,如果又有其他人也打开了这表单,那他们在打开的那一瞬间也同样触发了mapx函数,mapx函数聚合计算的结果同样是表单数据库内已录入的数据,所以他们表单里的通过mapx函数的计算结果彼此都是相同的,出现了计算值重复,这就是所谓的并发问题。

如果出现了并发问题,那起初想对表单提交次数做准确排序的目的就无法实现。

为了更加充分全面的理解表单各类处理动作的一系列特性,特制作下图做分析对比。(根据函数触发次数,触发范围,触发类型,数据是否入库4种纬度,对这表单一个完整处理过程如下分析图表。)





通过上图分析发现,能触发mapx函数计算的是新建和编辑这两种动作,新建动作触发的是1次,编辑动作可以根据填表人的意愿随意触发多次,由此看来,打开表单触发mapx函数运算的结果如果出现了重复值,那就可以再在表单内通过一些方式使得mapx函数再做一次甚至是多次的计算,就能解决并发问题。

所以由此来说并发问题并不是mapx函数造成的,而是函数触发的时间机制造成的。

由此可以看出,当出现并发问题后只要能再次触发mapx函数运算就可以解决问题。常用的两种方法是刷新表单和编辑表单内设定的函数组合或控件。



一、方法1:利用mapx函数,通过刷新页面的方式去除并发。
先简单回顾一下常用的处理并发问题的方法,如下图所示建表。
表单外链:https://jiandaoyun.com/f/59447661a692d31b05507559



(其中,排序控件函数如上“信息描述”处所写。)
此方法可行的原因是运用了单行文本控件不允许重复值的功能,如果出现重复值,就刷新页面让mapx函数重新调取数据库的数据再计算一次。



方法2:利用mapx函数,通过表单内设置刷新功能按钮的方式去除并发。

当表单需要填写控件较多,如果还是采用刷新的方式会比较浪费时间。如果表单内有些控件能起到类似刷新表单的功能岂不是更好。表单内能触发mapx函数重新计算的方法很多,下面以单选按钮组为例测试一下。

在上个表单的基础上,增加一个单选按钮组,并对“排序”控件重新写函数,如下图。
表单外链:https://jiandaoyun.com/f/5943edb16c914e0405da00db





此方法的目的是通过编辑“排序重复刷新按钮”,来实现再次触发“排序”控件里函数再次计算的功能。
看下排序函数,是如何实现的刷新功能。




很显然,当“排序重复刷新按钮”未被编辑时,mapx函数的触发是由打开表单的动作引起的,聚合计算的是那个时间点数据库里已有的数据;当“排序重复刷新按钮”被编辑时,再次触发mapx函数开始对当前数据库的数据做聚合计算,如果此时有并发问题,通过这个编辑刷新按钮的动作就解决了。
上面两个解决并发问题的方法,一个是通过刷新页面,一个是表单内设置刷新按钮,原理都是结合单行文本的不允许重复值和mapx函数来实现,那有没有让页面更简洁,且不需要用mapx函数的方法呢?接下来就给出一种这样的方法。



方法3:利用聚合表,及表单内编辑字段的方式自动触发数据联动的方式去除并发。

我们都知道聚合表有汇总表单已提交数据的能力,而且聚合汇总的结果能被其他表单调用,所以这个方法的核心就是要用到这个功能。首先如下图建立一个表单。
表单外链:https://jiandaoyun.com/f/59469656ad3c0e6605f68593




其中“刷新”控件写函数如下:





很显然”刷新“控件函数的目的是想通过日期时间字段和姓名字段的触发或编辑来带动IF函数的运算,进而使得“刷新”字段里显示的“刷新”二字是随日期时间字段和姓名字段的编辑而时时刷新的,这就保证了由它带动的“已报名人数”字段的数据联动是时时变化的的,进而确保了数据的及时准确更新,最大限度的降低并发问题的概率。(如果此时再出现并发,只需再点击一下姓名字段就可去除并发。)

另补充,制作聚合表并如下设置:



汇总字段是表单中的默认值1,如下图。




方法3表单中的“已报名人数”字段,数据联动到该聚合表,如下图:






方法4:编号中含有提交人工号的方式

理解此方法可行的原理,可以先回到造成并发问题的原因上来,“当多人同时填写表单时,mapx函数聚合调取的是数据库里已有的数据,导致mapx聚合的结果出现了重复值”。这里关键的一点是多人同时,但,当编号里本身就含有了可以识别不同提交人的符号(这里用工号)后,那这个含有mapx函数聚合结果和工号的编号,就可以做到不重复(除非同一填写人故意制造并发,比如同一人同时打开多台设备填写同一表单。就算出现这种情况,也可以通过编号的不允许重复值来加以控制)。如下图:




此方法相比之前3种方法的优点是比较容易理解且较容易实现。所以,建议一般的编号,可以采用此法,省时省力且可有效避免并发。另外,由于通过此法生成的编号里含有发起人工号,后期做数据追溯时,还可以通过编号直接知道当初此申请的发起人。



总结:
1、四种方法概括:

  • 方法1:利用mapx函数,通过刷新页面的方式去除并发。
  • 方法2:利用mapx函数,通过表单内设置刷新功能按钮的方式去除并发。
  • 方法3:利用聚合表,及表单内编辑字段的方式自动触发数据联动的方式去除并发。
  • 方法4:编号中含有提交人工号的方式。


2、4种方法都真正有效的前提是单行文本控件不允许重复值。而且通过分析测试发现,不允许重复值的属性是不受控件隐藏影响的,是一个比较特殊的控件属性,还可以由此实现其他一些特有的功能。




3、并发问题并不我们通常以为的mapx函数造成的,而是由函数触发的时间机制造成的。
4、有时解决问题,应该首先从造成问题的原因入手,这样找出的解决方法可能才是最直接最有效最简单的。





点击查看作者更多博文:
1、盲人妻子的困惑——子表单自动连续编号的问题--------------------时间: 2017-07-10】
2、让人又爱又恨的子表单--------------------------------------------时间: 2020-10-08】

作者简介:【点击查看作者社区主页】

  • 牛中伟
  • 简道云官方连续6年指定定制服务商
  • 利用简道云帮客户实施项目近300个
  • 在原简道云老社区更新发布博客44篇
  • 新老社区博客总阅读量超50万,留言1000余条
  • 其中关于子表单的一篇博客收到用户打赏金额累计超7000元
  • 关注帆软社区我的这个账号,有新博客更新,第一时间收到提醒
  • 感谢大家一路以来的认可和支持,我会再接再厉,分享更多有价值的内容
  • 如有任何简道云方面的问题,欢迎留言区留言或单独私信给我,期待与你的交流



不自谦能力概述:

 

  • 精通子表单各类复杂用法
  • 谙熟函数特性、及各种函数组合用法
  • 独创利用简道云处理多级BOM的方法
  • 深刻理解进销存系统及进销存思维模型
  • 有一定的文本书写能力,总结复盘能力
  • 较强的抽象思维能力、逻辑思维能力、统筹能力
  • 对陌生行业陌生业务有快速的信息搜集整合和学习消化能力
  • 拥有一整套成熟有效的整理系统需求文档的思想、方法和工具
  • 很多用户感觉一直解决不了的问题在我们这里可能早已不是问题
  • 了解如何制定完善的报表分析计划,并借此洞察项目业务背景和业务痛点。
  • 理解系统与企业管理的关系,对如何在企业顺利推进管理系统落地有丰富经验和独到见解。
  • 有一整套经上百大小项目锤炼过的适合简道云这类低代码工具帮助客户实施项目的流程和方法,确保系统更好实施,更快部署,更高完整度交付,确保系统更符合客户预期,甚至超预期,给客户真正带来价值!

 

 

懂简道云的冬泳高手,关注我的帆软社区账号,交个朋友!

编辑于 2020-12-2 18:26  

分享扩散:
参与人数 +1 F币 +10 理由
云团 + 10 10

查看全部评分

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

0回帖数 5关注人数 13722浏览人数
最后回复于:2022-4-12 15:36

返回顶部 返回列表