Sqlserver 利用时间戳 + 自增长ID 生成流水号 模拟并发请求生成重复ID 解决方法

1. 事件起因:

当在sqlserver 中利用 时间戳(22010110) + 请求终端ID (1001) + 四位流水号(开始0001) ;

四位流水号算法
创建表TZD_LSH ;其中id是 自增长 ;系数1

    insert  into TZD_LSH (Hoisd) select @hospcode  
    select newid = max(id) from TZD_LSH

2. 生产环境遇到 客户端获取到2个相同的ID

3. 模拟请求:在过程中获取max(int) 的地方加上延迟执行 waitfor delay '00:00:01' 、利用Jmeter 创建10个请求。

Sqlserver 利用时间戳 + 自增长ID 生成流水号 模拟并发请求生成重复ID 解决方法
Sqlserver 利用时间戳 + 自增长ID 生成流水号 模拟并发请求生成重复ID 解决方法

可以看到实际请求到的确实重复

4.解决办法: 利用sqlserver 函数 SCOPE_IDENTITY() ;

    insert  into TZD_LSH (Hoisd) select @hospcode  
    select newid=SCOPE_IDENTITY()

5.再次利用Jmeter请求10次无重复Id

上一篇:【转】SQLServer查询死锁


下一篇:sqlserver备份还原