sqlserver用timestamp協助解決資料並發衝突 轉【轉】

來源:互聯網
上載者:User

標籤:reader   寶貝   start   select   word   產生   儲存   sdn   語句   

http://blog.csdn.net/u011014032/article/details/42936783

關於並發請求,網上很多朋友都說的很詳細了,我就不在這裡獻醜了。這裡只記錄下剛剛完工的那個項目裡自己是如何用timestamp處理的,以備日後不時之需。

在sqlserver裡有個timestamp的欄位類型,如果我們需要對某個資料表進行並發請求的處理,以防止出現兩個使用者同時修改表中同一條資料造成衝突的情況。這時可以給該表添加一個timestamp的欄位,當添加、修改資料的時候,timestamp類型會自動產生一個新值,此時我們把timestamp欄位的值也作為update的where子條件之一就可以避免覆蓋其他使用者的修改行為了。

 

比如我有個產品表products,裡面有個欄位為buyer表示買家ID,如果某個客戶購買了商品,就會在相應的products的buyer裡記錄下自己的id,但是如果有兩個顧客同時都購買了某個商品(其實他們提交請求的時間是有差別的,但很可能就相隔幾毫秒,電腦能感知到,而人卻感知不到),同時向該商品的buyer裡寫入自己的id,那麼就會造成衝突,這時候我們應該優先處理時間稍微靠前的使用者,並且通知時間稍微靠後的使用者其他使用者已經購買。

詳細操作的SQL命令如下:

1、使用者訪問寶貝詳情頁,從資料庫中讀取寶貝資訊,這其中就包括欄位名為rowVersion的timestamp欄位類型的值(注意:要將rowVersion轉換成SQL中的長整型,以便後面比對),這時兩個使用者擷取到的rowVersion的值是相同的。

 

[sql] view plain copy 
  1. select productID,name,price,convert(bigint,fp.rowVersion) as version from products where productID=1058  

 

這一步要在程式中記錄下rowVersion的值,比如我們可以存到一個string類型的欄位裡,如:strRowVersion =  reader["version "].ToString();


2、使用者修改buyer為自己的ID

update products set buyer=35 where productID=1058 and rowVersion = @version

這一步中我們可以向SQL語句中傳入剛剛記錄下的rowVersion值,如果是前一個使用者儲存成功,那麼rowVersion值就會自動改變。這時候後一個使用者也用相同的SQL語句來修改的話就會失敗,然後我們可以向使用者提示該商品已被其他使用者購買。

sqlserver用timestamp協助解決資料並發衝突 轉【轉】

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.