標籤: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
- 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協助解決資料並發衝突 轉【轉】