Foxtable(狐表)用户栏目专家坐堂 → [求助]关于流程审批的排队或多线程处理


  共有6544人关注过本帖树形打印复制链接

主题:[求助]关于流程审批的排队或多线程处理

帅哥哟,离线,有人找我吗?
有点蓝
  1楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:110738 积分:563610 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2023/1/10 14:49:00 [显示全部帖子]

建议客户端把审核消息直接保存到数据库的一个流程表。然后服务端使用数据库事务+异步的方式,按时间顺序取流程表数据处理。类似:


 回到顶部
帅哥哟,离线,有人找我吗?
有点蓝
  2楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:110738 积分:563610 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2023/1/10 15:42:00 [显示全部帖子]

使用事务:http://www.foxtable.com/webhelp/topics/3312.htm

do while true
Dim cmd As new SQLCommand()
cmd
.ConnectionName = "Orders"  '指定数据源
Try

    Dim id As Integer 10258
    cmd.BeginTransaction() 
'
开启事务
    cmd.CommandText = 
"select top 1 * from 表A
 Where 已判断=false"
    
dim dt as datatable = cmd.ExecuteReader()
if dt.datarows.count = 0 then
exit do
end if
    
'
继续使用同一个SQLCommand执行其它SQL语句.
    cmd.CommandText = "Update 
表A Set 已判断= true Where OrderID = " & dt.datarows("
OrderID ")
    cmd.ExecuteNonQuery()
    cmd.Commit() 
'
提交事务
Functions.AsyncExecute("nextflow",参数1,参数2,参数…)  '异步调用
Catch
 ex As Exception '如果出错
    cmd.Rollback() 
'
则回滚事务
    
MessageBox.Show(ex.Message, "错误",MessageBoxButtons.OK,MessageBoxIcon.Error)
End
 Try
loop

 回到顶部
帅哥哟,离线,有人找我吗?
有点蓝
  3楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:110738 积分:563610 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2023/1/10 16:29:00 [显示全部帖子]

并联审批的逻辑是怎么样的?

 回到顶部
帅哥哟,离线,有人找我吗?
有点蓝
  4楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:110738 积分:563610 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2023/1/10 16:35:00 [显示全部帖子]

没看懂。没有理解您具体的审批处理过程和逻辑,没有办法给出进一步的建议

 回到顶部
帅哥哟,离线,有人找我吗?
有点蓝
  5楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:110738 积分:563610 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2023/1/10 17:25:00 [显示全部帖子]

这个和异步不异步什么的没有关系。完全就是流程逻辑设计问题。

设计一个表,谁审批过就添加一行记录。B要审批,就先判断这个表,有A审批过的记录,有才能审批。同样D要审批,就先判断这个表,有没有B和C审批过的记录,有才能审批....

 回到顶部
帅哥哟,离线,有人找我吗?
有点蓝
  6楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:110738 积分:563610 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2023/1/10 20:03:00 [显示全部帖子]

这种事情在客户端处理就行了吧。B审核的时候,如果不同意,直接发消息回A即可;如果同意,就查询同环节有没有其它并联的审核者,比如有C,那么查查C是否已经审核,如果未审核,直接退出即可,如果已经审核就,获取下一节的审核人D,然后给D发消息就行了。有必要还到服务器排队等待吗?

 回到顶部
帅哥哟,离线,有人找我吗?
有点蓝
  7楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:110738 积分:563610 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2023/1/11 16:58:00 [显示全部帖子]

13楼的几个操作,除非网络非常差,否也就是不到1秒的时间就可以解决的事。

如果是在服务器处理,和数据库在同一台电脑的话,2个查询一个消息发送,估计也就100毫秒左右的事,这种还需要多线程?启动一个线程的消耗估计都不止100毫秒了。

不如具体举例说明,现在的实际执行操作会慢到什么程度,会需要使用多线程?

 回到顶部
帅哥哟,离线,有人找我吗?
有点蓝
  8楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:110738 积分:563610 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2023/1/11 17:26:00 [显示全部帖子]

在服务器操作,如果和数据库在同一台电脑,也就数据库的连接查询操作会快一点,代码的执行效率都一样的。

用户点个按钮滴答2下,一秒,不算慢了吧。如果觉得慢,可以考虑把客户端的代码放到异步函数里处理。

何况在客户端,可以不同的用户都是并发操作的,不会互相影响。结果把审核都放到服务器排队,不把并发变相变成了顺序操作了吗,这样不更慢!

 回到顶部
帅哥哟,离线,有人找我吗?
有点蓝
  9楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:110738 积分:563610 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2023/1/12 9:10:00 [显示全部帖子]

不排除有这种情况。比如在1秒内同时提交数据。这种情况应该不多,除非客户端非常多,并且大家都集中在很短一个时间段内对同一个流程进行审批操作。

这种少数情况,如果要在服务端处理,需要有一个记录用户发送消息的表或者列。让服务器可以查询B或者C有没有发送过消息给D。然后服务端在计划管理里每10秒查询一次的话,按顺序查询发消息即可。其实没有什么必要多线程,除非在这10秒内会出现很多同时提交的并发处理。

 回到顶部