從sql語句的角度解刨SqlServer插入語句的併發問題

今天收到一個小學弟的求助,數據庫插入偶爾重複,怎麼在sql語句上進行解決。html


 

Q:學長,我導入excel數據的操做,平時使用好好的,怎麼忽然發生插入重複的問題?sql

A:你是使用哪一個ORM框架進行操做的?數據庫

 

Q:什麼是ORM框架?微信

A:額……,你數據庫怎麼連接操做的?併發

 

Q:我使用Connection對象進行連接操做的。微信公衆平臺

A:哦,ADO.NET呀,你把導入數據的插入sql語句的截圖發出來看看。框架

 

Q:sql截圖(這裏就不展現了,就是一個簡單的insert into,如:INSERT INTO aTable(id) VALUES("1"))學習

A:哦哦,你語句沒有併發狀況下沒問題,可是多人同時導入數據就存在併發,數據重複意料之中。測試

 

Q:啊,這還涉及到併發?那我怎麼修改呀優化

A:簡單,不改變其餘操做的狀況下,你把插入語句加事務加鎖機制既能夠了。

 

Q:額……不怎麼懂,有demo嗎?

A:沒事,我就在你的sql語句上優化下,你直接粘貼就能夠了。

 


 

咱們來解刨一下這個問題,如今不少人依賴ORM,都沒怎麼寫sql了,咱們就從sql的角度解析一下這個問題。

這裏很差提供代碼展現,咱們這裏就簡單進行一個模擬還原使用場景。

建立一個表,命名爲aTable,裏面就一個字段id,int類型,而後插入一個數據爲1;

 

操做一:重現問題出現緣由

而後同時(有點間隔也不要緊,但隔時間要小)在查詢分析器的兩個窗口中執行下以下語句:

declare @id int
set @id = ( select max(id) from aTable )
while @id < 40000
 begin
 set @id = @id + 1
 insert into aTable ( id ) select @id
 set @id = ( select max(id) from aTable ) 
 end

這樣的目的在於測試當兩個用戶同時操做同一個表時的重複性操做,模擬多用戶同時導入相同的excel數據,

結果:共獲得42953條數據,其中2953條重複,固然,這個重複數據跟執行間隔時間有關。


 

操做二:進行第一步優化,添加事務

 sql語句加上事務處理,

而後同時(有點間隔也不要緊,但間隔時間要小)在查詢分析器的兩個窗口中執行下以下語句:

begin tran  --開啓事務

declare @id int
set @id = ( select max(id) from aTable )
while @id < 40000
 begin
 set @id = @id + 1
 insert into aTable ( id ) select @id
 set @id = ( select max(id) from aTable ) 
 end

commit tran  --提交事務

結果:共獲得40000條數據,無重複,可是執行時間是沒加事務處理時的6倍,時間過久。


 

操做三:進行第二步優化,添加鎖

 sql語句加上事務處理和鎖機制,

而後同時(有點間隔也不要緊,但間隔時間要小)在查詢分析器的兩個窗口中執行下以下語句:

begin tran --開始事務

declare @id INT
set @id = ( select max(id) from aTable )
while @id < 40000
begin
set @id = @id + 1
--添加鎖 with(tablock)
insert into aTable with (tablock) ( id ) select @id
set @id = ( select max(id) from aTable )
end

commit tran --提交事務

結果:共獲得40000條數據,無重複,執行時間快。


 

這樣就從sql上簡單解決併發問題啦,固然,還有其餘問題和解決方法,

這裏就不作敘說了,具體狀況遇到再分析,拜拜。

 

歡迎關注訂閱個人微信公衆平臺【熊澤有話說】,更多好玩易學知識等你來取
做者:熊澤-學習中的苦與樂
公衆號:熊澤有話說
出處:  https://www.cnblogs.com/xiongze520/p/14524707.html
創做不易,轉載或者部分轉載、摘錄,請在文章明顯位置註明做者和原文連接。  
相關文章
相關標籤/搜索