天天看點

探讨SQL Server并發處理隊列資料不阻塞解決方案前言

之前對于并發這一塊确實接觸的比較少,自從遇到現在的老大,每寫完一塊老大都會過目一下然後給出意見,期間确實收獲不少,接下來有幾篇會來講解SQL Server中關于并發這一塊的内容,有的是總結,有的是學習,若有錯誤見解請批評性指出。

在我們的項目中對于購買産品的使用者會對應配置設定卡密,同時會更新其卡密的狀态為已使用,是以當出現并發時此時我們不加以控制會導緻同一個卡号和密碼被不同的使用者所使用,這樣的情況是不能允許的,此時我們迫切需要解決對卡密使用後的更新和産生的并發。是以有了此文的産生。我們接下來來建立測試表。

接下來我們插入十條測試資料

探讨SQL Server并發處理隊列資料不阻塞解決方案前言

接下來我們打開兩個會話運作如下SQL語句:

此時我們看到打開的兩個會話會同時處理相同的行。

探讨SQL Server并發處理隊列資料不阻塞解決方案前言
探讨SQL Server并發處理隊列資料不阻塞解決方案前言

如上則不是我們想要的結果,此時我們再來在如上基礎上加一個更新鎖,然後SQL Server查詢引擎會不允許其他讀取者來擷取更新鎖,此時将能夠有效的處理對應對應的行記錄,但是會造成阻塞,如下:

探讨SQL Server并發處理隊列資料不阻塞解決方案前言
探讨SQL Server并發處理隊列資料不阻塞解決方案前言

上述雖然能解決更新問題,但是此時會造成阻塞,一旦并發量比較大此時将造成長時間阻塞,目前正在執行的更新會話必須等待另外一個更新會話執行完畢同時釋放更新鎖。此時為了解決阻塞問題,在SQL Server中通過添加READPAST關鍵字來告訴SQL Server引擎一旦遇到被鎖住的行,你就跳過吧不用理會,是以不會再造成阻塞問題。此時最終的代碼将變成如下:

通過UPDLOCK+READPAST結合使用将對于處理并發更新時,就像處理隊列資料一樣,但是不會造成阻塞,此時将給予我們最好的性能。我們結合上述所講,來查詢出資料并删除對應資料且,不會出現重複删除情況且不會導緻阻塞,此時代碼将變成如下:

探讨SQL Server并發處理隊列資料不阻塞解決方案前言
探讨SQL Server并發處理隊列資料不阻塞解決方案前言

本文我們探讨産生并發在SQL Server中如何不處于阻塞并且得到較好的性能,對于那種秒殺情況,這種方案不失為一種解決方案,請問你有何高見?