求助:一个WINFORM业务的设计。

艾克是大叔 2020-02-22 01:10:14
感觉WINFORM多数情况下是C/SQLSERVER的结构,WEB开发才是真正的C/S吧...
言归正传。

业务是用户需要到订单表中获得待处理的订单。
用户处理当前订单时其他人不能获取这个订单。
程序可能因各种原因终止,系统错误、断电、用户退出等。
希望能实现程序终止后未处理完的订单状态能自动变回待处理状态(WEB的话可以用SESSION)。

并发什么的已经搞定了,不需要考虑。
因为是C/SQLSERVER的程序所以没有服务端。
想了很久都没想出特别好的办法。
所以求助各位老大了。


...全文
145 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
艾克是大叔 2020-02-22
  • 打赏
  • 举报
回复
引用 1 楼 github_36000833 的回复:
其他服务或模式更适合(比如消息队列,工作流等),但用SQLSERVER也可以做。你要自己维护一些数据结果,比如:

CREATE TABLE 订单处理表(
订单号 int PRIMARY KEY,
处理方 nvarchar(32),
超时点 datetime2(7),
同步点 rowversion
);

流程上,处理方可以
1、申请尚未处理的订单,或处理超时的订单
select top (1) * from [订单处理表] where 处理方 is null or GETDATE() > 超时点;
-- 拿到订单号,假设123,和同步点,假设0x002

2、打标志,表示处理中,同时设置超时
update [订单处理表] set 处理方 = 'me', 超时点 = DATEADD(minute, 30, GETDATE()) where 订单号 = 123 and 同步点 = 0x002;
-- 设置处理方,设置超时,检查ExecuteScalar的返回。1表示成功放标,0表示其他人已经抢走。

3、处理订单
select top(1) * from  [订单处理表] where 处理方 = 'me' and 订单号 = 123;
-- 取回更新后的同步点,假设0x003

4、处理完毕后,从订单处理表中移走。
delete [订单处理表] where  订单号 = 123 and 同步点 = 0x003;
-- ExecuteScalar返回1表示成功,如果返回0,表示其他人拿走处理了(超时)。

每个步骤都要检查影响行数目,同步点这里很重要,是正确处理的保证。

感谢回复,我理解了,超时点的点子很棒。
github_36000833 2020-02-22
  • 打赏
  • 举报
回复
其他服务或模式更适合(比如消息队列,工作流等),但用SQLSERVER也可以做。你要自己维护一些数据结果,比如: CREATE TABLE 订单处理表( 订单号 int PRIMARY KEY, 处理方 nvarchar(32), 超时点 datetime2(7), 同步点 rowversion ); 流程上,处理方可以 1、申请尚未处理的订单,或处理超时的订单
select top (1) * from [订单处理表] where 处理方 is null or GETDATE() > 超时点;
-- 拿到订单号,假设123,和同步点,假设0x002
2、打标志,表示处理中,同时设置超时
update [订单处理表] set 处理方 = 'me', 超时点 = DATEADD(minute, 30, GETDATE()) where 订单号 = 123 and 同步点 = 0x002;
-- 设置处理方,设置超时,检查ExecuteScalar的返回。1表示成功放标,0表示其他人已经抢走。
3、处理订单
select top(1) * from  [订单处理表] where 处理方 = 'me' and 订单号 = 123;
-- 取回更新后的同步点,假设0x003
4、处理完毕后,从订单处理表中移走。
delete [订单处理表] where  订单号 = 123 and 同步点 = 0x003;
-- ExecuteScalar返回1表示成功,如果返回0,表示其他人拿走处理了(超时)。
每个步骤都要检查影响行数目,同步点这里很重要,是正确处理的保证。

17,741

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 .NET Framework
社区管理员
  • .NET Framework社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧