存储过程是怎么生成单号的?

简单举例,我有一台服务器安装SQL Server,100个客户端同步上线操作一个受订单表,每个受订单有明细,举例如下:请问:你们是如何解决并发问题,存储过程以表作为参数同时生成单号,还是用触发器?还是用单个参数不用表参数??
我们有可能同一个时间去生成一个单,如果没生成一条记录我们就生成一个单号,绝对不现实,一张单可能有N种产品。
我们只能用一个数组集体去生成单号,防止单号紊乱,我之前的做法是用一个自定义表参数,相当复杂,写过几次就感觉烦了,请问你们是怎么生成的?还要规避单号并发问题,不能同时生成了一个单号。这种是有可能的,比如张三、李四同时在2016-6-8 11:20:30.410做了个订单,SQL Server存储过程在取最大值参数是一样的,那单号生成也会是一样的。

通常我会用最简单的办法:利用SQL数据库的自增ID。
如果是存储过程里面,那么先insert语句增加记录(不写单号或随便给一个),然后用update语句,利用自增id(insert会自动生成,并且绝对不重复)和日期拼接一个字符串,这样就可以了。这里有个需要注意的,如果你没有其它的唯一标识,那么需要使用事务,将insert和update在一个事务里面完成(begin trans/end trans),这样取order by id desc的top1就可以了,否则可能取错。或者用where 单号='预设无效值' 也是可以的,对应更新ID,无论几条记录。
以上是简单办法,如果一定要一个语句会比较复杂,会用到游标或者行号,实际的效率也不高,因此,如果在存储过程中,那么这个方法是最靠谱的。追问

这个方法不错我知道,大家也是这么做的,现在我问的是如何使用参数,用表参数,还是存储一个临时表名好一点,还是存储单一参数,多次运行存储过程?
表类型参数是自顶一个一个表类型,然后变成过程中直接把表参数赋值给他,临时表的方法就是数据标记在临时表中,这个临时表是存储过程创建的,不是实际存在的实际存在就会造成数据重叠,多用户不好操作,或者一个用户多开重复等现象,存储参数获取单号,会引起同时间并发重复。

追答

临时表的方法,之前也用过,属于无奈的办法(但是还算靠谱)。至于你说单一参数,没理解你的意思。
实际上,解决并发,SQL的思路就是“事务”,任务可以并发,但事务不能并发,因此只要合理利用这一点,就不会存在重复,至于怎么做,根据实际需要按照最有效率的来。
我认为你讨论的“参数”是没有意义的,参数是外部传递的,你如何保障唯一性?即使时间戳,也有重复的概率,不重复的本质在于事务(即使ID主键/行号也都是事务处理),让ID的产生排队(而且是最小时间片的排队)是核心思路。

追问

这么说我使用触发器还要比存储过程好一点吗?自增列产生ID的方式不就是个触发器吗?

追答

不能这么理解。不是说自增类似触发器,就说触发器效率高,没有因果关系。

温馨提示:答案为网友推荐,仅供参考
相似回答