sql语句单据编号生成防并发
有用户反馈说发现重复单据号,检查发现以下单据号被分配给了不同的两个职工

系统中使用语句exec GetNewOrderNumber 'pwgnumber','PWG',1, @pwg_number output
来产生唯一单据号
此存储过程中获取最大值的语句如下:

if exists(select * from s_systemset(nolock) where classname=@keyname and typename=@keyvalue)
begin
begin tran
--语句段1
select @ordernumber=typename+substring(replicate('0',convert(int,8))+itemvalue,
len(replicate('0',conv ert(int,8))+itemvalue)-(convert(int,8)-1),convert(int,8))
from s_systemset(nolock)
where classname=@keyname
and typename=@keyvalue
--语句段2
update s_systemset
set itemvalue=itemvalue+1
from s_systemset
where classname=@keyname
and typename=@keyvalue
commit tran
end

|
1
|
同时开两个SQL查询窗口执行以下语句 |
窗口一:waitfor delay '00:00:05'
print '1'
declare @ordernumber varchar(20),@i int=1,@sysid int=1
while @i<=31000
begin
exec TestNewOrderNumber 'testnumber','TST',1,@ordernumber output
insert into test_log(docnumber,sysid,indate)
values (@ordernumber,@sysid,GETDATE())
set @i=@i+1
end
窗口二:
waitfor delay '00:00:06'
print '2'
declare @ordernumber varchar(20),@i int=1,@sysid int=2
while @i<=32000
begin
exec TestNewOrderNumber 'testnumber','TST',1,@ordernumber output
insert into test_log(docnumber,sysid,indate)
values (@ordernumber,@sysid,GETDATE())
set @i=@i+1
end
检查是否有重复:
select docnumber,COUNT(docnumber)
from test_log
group by docnumber
having COUNT(docnumber)>=2
测试结果如下:有8条记录重复。
在两个不同用户同一秒调用此语句后,产生了重复的Pwg_Number,为什么呢?
在SQL中已经用了事务来获取最大值,为何不同用户几乎同时调用时会返回相同的pwg_number?
尝试将语句段1和语句段2对调如下:

--将语句段1和语句段2对调
begin tran
update s_systemset --语句段2
set itemvalue=itemvalue+1
from s_systemset
where classname=@keyname
and typename=@keyvalue
--语句段1
select @ordernumber=typename+substring(replicate('0',convert(int,8))+itemvalue,len(replicate('0',convert(int,8))+itemvalue)-(convert(int,8)-1),convert(int,8))
from s_systemset(rowlock) --将nolock改为rowlock
where classname=@keyname
and typename=@keyvalue commit tran

重复在两个窗口并行测试,第一次是9万笔,第二次是90万笔,第3次10万笔。统计没有重复记录。

到这里重复单据号的问题是否算是已经得到解决了呢?
各位SQL大牛,为什么语句段一和语句段二的顺序对调后,就不会有重复了。
问题来了,以上语句真得能够保证产生唯一的最大值吗
sql语句单据编号生成防并发的更多相关文章
- C# 生成编号(防并发)
今天抽了点时间,写了一个通用的生成编号的程序! 我的生成规则为年月日+两位编号,即:yyyyMMdd+两位编号,譬如:2018101001 / 2018101002 / 2018101003 首先,一 ...
- MySQL通过SQL语句来直接生成新表
1. 既复制表结构,也复制表数据 mysql> CREATE TABLE tmp_table SELECT * FROM dede_news; 说明:这种方法的缺点就是新表中没有了旧表的prim ...
- 在sqlserver中,使用sql语句更新数据库:生成随机数,更新每一行中的年龄字段
use School --指定数据库 declare @min_id int --声明整数变量@x set @min_id=(select MIN(Id) from Students) --给变量@x ...
- SqlServer 中如何查看某一个Sql语句是复用了执行计划,还是重新生成了执行计划
我们知道SqlServer的查询优化器会将所执行的Sql语句的执行计划作缓存,如果后续查询可以复用缓存中的执行计划,那么SqlServer就会为后续查询复用执行计划而不是重新生成一个新的执行计划,因为 ...
- mysqls,为node.js而编写的sql语句生成插件 (crud for mysql).
It is written in JavaScript,crud for mysql.You can also use transactions very easily. mysqls 一款专为nod ...
- 年终巨献 史上最全 ——LINQ to SQL语句
LINQ to SQL语句(1)之Where 适用场景:实现过滤,查询等功能. 说明:与SQL命令中的Where作用相似,都是起到范围限定也就是过滤作用的,而判断条件就是它后面所接的子句.Where操 ...
- LINQ to SQL语句大全
LINQ to SQL语句大全 LINQ to SQL语句(1)之Where 适用场景:实现过滤,查询等功能. 说明:与SQL命令中的Where作用相似,都是起到范围限定也就是过滤作用的,而判 ...
- 史上最全 ——LINQ to SQL语句
LINQ to SQL语句(1)之Where 适用场景:实现过滤,查询等功能. 说明:与SQL命令中的Where作用相似,都是起到范围限定也就是过滤作用的,而判断条件就是它后面所接的子句.Where操 ...
- LINQ to SQL语句(17)之对象加载
对象加载 延迟加载 在查询某对象时,实际上你只查询该对象.不会同时自动获取这个对象.这就是延迟加载. 例如,您可能需要查看客户数据和订单数据.你最初不一定需要检索与每个客户有关的所有订单数据.其优点是 ...
随机推荐
- 【费马小定理+矩阵快速幂】HDU4549——M斐波那契数列
[题目大意] M斐波那契数列F[n]是一种整数数列,它的定义如下:F[0] = aF[1] = bF[n] = F[n-1] * F[n-2] ( n > 1 )现在给出a, b, n,求出F[ ...
- dubbo安装(转载)
1. 概述 ZooKeeper是Hadoop的正式子项目,它是一个针对大型分布式系统的可靠协调系统,提供的功能包括:配置维护.名字服务.分布式同步.组服务等.ZooKeeper的目标就是封装好复杂 ...
- 【教训】 form表单提交时,action url中参数无效
今天提交一个表单,内容参考如下: <form action="add.php?a=123&b=456"> <input type="hi ...
- 浅谈RBF函数
所谓径向基函数 (Radial Basis Function 简称 RBF), 就是某种沿径向对称的标量函数. 通常定义为空间中任一点x到某一中心xc之间欧氏距离的单调函数 , 可记作 k(||x-x ...
- 【spring data jpa】使用jpa进行update更新操作,避免空字段和更新后即时返回给前台的问题
修改操作 如果使用的JPA,应该是 findByUid之后 将新的值对old进行赋值,最后对old值进行flush(),即可完成更新,而不应该去更新新的实体. 示例代码: 以后补充
- ubuntu16.04 登录密码破解方法
1:开机按Shift键,出现如下界面.(手速要快,Shift键要按时间久一点) 选择第二项 2:按回车键进入如下界面,然后选中有recovery mode的选项(第三项) 3:按e进入如下界面,并找到 ...
- CompileGLShader
//-----------------------------------------------------------------------------// Purpose: Compiles ...
- Kafka server.properties配置,集群部署
server.properties中所有配置参数说明(解释) broker.id =0每一个broker在集群中的唯一表示,要求是正数.当该服务器的IP地址发生改变时,broker.id没有变化,则不 ...
- 数据写入到TXT文档中
public class FileWrite { public File file; public FileOutputStream stream = null; //每次写入都会覆盖之前的内容 pu ...
- 查看某一个开发者代码修改量的脚本(ios平台可用)
#!/bin/sh # This is a script that help you get your team member's productivity # by analyzing his/he ...