生成了重復的唯一單據號?


有用戶反饋說發現重復單據號,檢查發現以下單據號被分配給了不同的兩個職工

系統中使用語句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 

 

同時開兩個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大牛,為什么語句段一和語句段二的順序對調后,就不會有重復了。

 問題來了,以上語句真得能夠保證產生唯一的最大值嗎?


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM