每次寫部落格,第一句話都是這樣的:程式員很苦逼,除了會寫程式,還得會寫部落格!
當然,題外話說多了,咱進入正題!
在處理大資料的時候,經常會發生并發,并發的情況發生後,會出現資料污讀,進而産生髒資料。
首先通過一段程式進行說明、<有興趣的小夥伴可以複制粘貼這段程式>。
項目背景:模拟大轉盤抽獎程式。
場下坐有近萬名群衆,他們在同一時刻同時抽獎,獎品分為一等獎:奔馳汽車10輛,二等獎:别克汽車20輛,三等獎:現代汽車30輛。(獎品資訊存入資料庫)
獎品資訊如下(資料庫部分):
create table JP_test
(
Id int identity(1,1),
JpLeave int,--獎品等級
JpName nvarchar(50),--獎品名稱
jpCount int,--獎品數量
)
insert into JP_test values(1,'奔馳汽車',10)
insert into JP_test values(2,'别克汽車',20)
insert into JP_test values(3,'現代汽車',30)
update JP_test set jpCount=10 where JpLeave=1
update JP_test set jpCount=20 where JpLeave=2
update JP_test set jpCount=30 where JpLeave=3
--以上SQL語句大家看懂表示沒壓力。在此不作講解。
程式思路:通過開辟線程進行模拟操作,一個線程代表一個群衆,由于群衆近萬人,我們暫且開辟十個線程并通過FOR循環進行模拟!
條件判斷:當資料庫中一等獎資料小于1時,不再進行一等獎的抽獎工作,也就是不再進行針對一等獎數量的減少工作。同理二等獎,三等獎。
最後輸出抽獎後的一等獎,二等獎,三等獎數量。
按照我們的設計思路,很顯然最後的答案應該為:一等獎,二等獎,三等獎數量都為0,真實情況是否如此?請看下面代碼。
模拟代碼如下:
T_SQL代碼如下:
下面我們看看程式執行的結果(因為近萬名群衆同時抽獎,同時與資料庫進行互動,是以程式運作會占用15秒左右的時間,請大家耐心等待):

呵呵:最後一等獎,二等獎的數量都變成了負數(當然三等獎也可能為負數)!如果這個活動是公司年會抽獎,那麼你注定不好過年了!哈哈哈!
究其原因,就是咱們在操作資料庫的時候,沒有進行并發處理。有興趣的小虎伴們也可以嘗試: Thread td1 = new Thread(choujiang);進行操作!在此就不作示範了!
至此本篇部落格的任務就算完成了,模拟并發咱們也做到了!程式寫的比較簡單醜陋,歡迎大家積極改善發言!