C#关于多进程同步操作的问题

.Net技术 码拜 4年前 (2016-09-14) 609次浏览
       先描述一下问题。本人有多个进程在不同的电脑上(局域网环境)同时运行。这些进程都在数据库里面存数据或在修改数据库里面的数据,但是存的表或修改的表可能不一样。表的结构也不一样。
但是不管怎样操作,有一个字段(箱号)(全部表都具有)会对这些进程造成互相影响。进程有可能是不一样的软件启动的。这个箱号在数据库中全部表当中是唯一存在的。但是这些进程都会生成一个箱号。这个箱号是累加的。
假设这些进程名字为A,B,C。(有可能会更多)
A是流水线的。B,C是库房的。A,B,C三个进程都在生成数据或修改数据,这些数据字段信息包含了箱号。
问一下下,本人该怎么实现这A,B,C三个进程不会生成重复的箱号。
这个箱号是从日期+分隔符+0-99999的一个数字(例如1608S00001表示16年8月的第1箱),每个月自动清零。目前本人是划分了箱号的号段,某些地方只能使用某个号段,流水线使用一个号段,库房使用另一个号段。
但是今后随着生成箱号的地方的增多,不可能无限制的划分吧。而且现在数据库用的SQLServer,是装在一台PC机上的。
假如每个进程都去访问数据库也存在着一个问题。例如数据库里面最大一个箱号是1608S90000,这个时候A,B俩进程正好先后去访问了,取得了1608S90000,那么A,B就应该都使用1608S90001,这就造成了箱号重复了。生成箱号是人工去扫描设备,然后程序生成的。所以人工的频率这个问题不好规避。
本人想过一种方法,采用UDP广播,假如这个箱号正在被某一个进程使用,则通知其他进程,你们使用下一个箱号吧。
各位有没有什么好的办法。怎么实现本人的需求。就是保证每个进程生成的箱号彼此之间都是唯一的。
解决方案

5

奇怪的需求!
为什么同一物件的编号(箱号)会在不同的流转阶段会不同?
你怎么知道流水线上下来的 1608S90001 到哪里去了呢

10

这个箱号重复问题可以使用自动编号解决啊, 自动编号是不会重复的,
原因是要每月清零, 所以要在自动编号的基础上做一个减法,具体如下:
一个表有三个字段, 自动编号,前缀,插入时间, 当需要箱号的时候往这张表插入一条数据得到最新的自动编号,
然后查相同前缀,但自动编号比刚插入的自动编号小的记录数, 再加一就是箱号的后缀了.
自动编号,前缀,时间,计算出来的箱号
1,1608S,2016-8-1 0:11, 1608S00001
2,1608S,2016-8-1 0:12, 1608S00002
3,1608K,2016-8-1 0:13, 1608K00001
4,1608S,2016-8-1 0:14, 1608S00003

15

引用:
Quote: 引用:

订单号问题,即怎么样生成不重复的订单号?

可以这么理解。本人的理解就相当于抢购商品一样。这些进程比拟成抢购商品的人。箱号比拟成商品。
大家一起来抢购商品,现在这个商品(箱号)被甲抢到了,然后甲通知大家:好了,牙膏被本人抢到了,现在我们来抢牙刷。
这样可以避免东西(箱号)已经被抢到了,其他人还在那里抢(使用)。现实情况就是:箱号1608S90002已经被A进程使用,那么其他B,C,俩进程就不能使用了,得使用其他箱号。

那就是并发控制。在数据库某张表用于产生箱号(订单号),在修改值期间,是锁定这张表并增加的。调用时,直接getMaxID()。一般都是这样的,假如并发量大,就加上散列、时间等分流处理,可以保证不会重复。

5

写个存储过程,getMaxID(),调用时直接自增并返回。
用局域网广播始终有问题的,万一某台机器暂时没有响应就gg了,而且扩展到Internet环境后就得推倒重做。

5

你这又不是千万级的电商应用,就一个企业信息系统,用数据库表行级锁不就行了吗?

10

你该去了解下,什么是数据库事务级别。你这种情况,只需要使用Serializable级别来读取最大号即可(读取当前号码+1,并将新最大号写入数据库表)

5

在你的描述中,全部的箱号在进入下一个环节后就无效了
那么也就不存在冲突问题
至多在箱号上加上扫描员编号

5

用guid,这个不会重复

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明C#关于多进程同步操作的问题
喜欢 (0)
[1034331897@qq.com]
分享 (0)