博主的APP最近又新加了一個小功能,每一個員工均可以上傳本身的工做照,其餘員工能夠點贊,規則是:每張工做照每一個員工(除上傳者外)每日可點贊一次。舉個例子:數據庫
現有註冊員工ABCD四人,A上傳工做照兩張P1和P2,BCD三人天天可爲P一、P2分別點贊一次編程
博主略加思考,寫了下面一段代碼來實現:併發
1 /// <summary> 2 /// 投票 3 /// </summary> 4 /// <param name="id">被投票對象ID</param> 5 /// <param name="up">贊OR踩</param> 6 /// <param name="voterName">投票人</param> 7 /// <param name="canVote">是否容許投票</param> 8 /// <returns></returns> 9 public int Vote(int id, bool up, string voterName, out bool canVote) 10 { 11 canVote = repo.RecordVote(voterName, id, timeService.Now); 12 if (canVote) 13 { 14 return repo.UpdateVoteCount(id, up ? 1 : -1); 19 } 20 return 0; 21 }
注:dom
1.RecordVote()方法記錄投票信息,UpdateVoteCount()方法執行投票,並返回當前被點贊數spa
2.再來看看RecordVote()方法的實現:code
1 private static object voteLocker = new Object(); 2 3 public bool RecordVote(string voterName, int staffId, DateTime voteTime) 4 { 5 lock (voteLocker) 6 { 7 for (; ; ) 8 { 9 var voter = db.Voters.FirstOrDefault(t => t.VoterName == voterName && t.StaffId == staffId); 10 if (voter != null) 11 { 12 if (voter.VoteTime.Date == voteTime.Date) 13 { 14 return false; 15 } 16 voter.VoteTime = voteTime; 17 } 18 else 19 { 20 voter = new FVoter() { VoterName = voterName, StaffId = staffId, VoteTime = voteTime }; 21 db.Voters.Add(voter); 22 } 23 try 24 { 25 db.SaveChanges(); 26 return true; 27 } 28 catch (Exception) 29 { 30 } 31 } 32 } 33 }
3.OK,再看看UpdateVoteCount()方法實現對象
1 private static object locker = new Object(); 2 3 public int UpdateVoteCount(int staffId, int voteCountChange) 4 { 5 lock (locker) 6 { 7 for (; ; ) 8 { 9 var staff = db.Staffs.FirstOrDefault(i => i.Id == staffId); 10 staff.VoteCount += voteCountChange; 12 try 13 { 14 db.SaveChanges(); 15 return staff.VoteCount; 16 } 17 catch (DbUpdateException) 18 { 19 Thread.Sleep(random.Next(1, 10)); 20 } 21 } 22 } 23 }
好嘛,這下寫完了開始使用,也沒啥問題。APP呢也沒上線,沒啥用戶,就幾個開發和公司內部的人點來點去...blog
那麼,問題來了。好比一個管理員錄入員工信息的方法,基本需求是:管理員提早錄入全部簽約員工信息,員工註冊系統時輸入手機號即被識別爲已簽約員工,我的信息自動獲取。那這個方法確定也是須要加上lock的,由於咱們會同時存在多個管理員錄入信息,要保證不重複錄入,只有加上lock...開發
我想問的是:string
1.有木有哪位大神能簡單的概括一下什麼樣的上下文中須要加lock,須要作併發處理?是否是全部可能併發的方法都須要?
2.管理員的操做算不算併發操做?系統目前容許同一個管理員帳戶在多端登陸操做,那是否是管理員操做的全部方法都須要作併發控制?
3.由2引伸到員工用戶與企業用戶,若是我開放容許這些用戶的帳戶在多端登陸系統,是否是都算併發?
4.再來隨便挑一個方法,好比註冊方法,用戶名爲郵箱,要求不重複,然而個人數據庫字段並無作惟一約束,是否是也得加上lock?由於是有可能同時不少用戶用同一個郵箱註冊的,或者客戶端沒寫好,屢次重複點擊了註冊按鈕...
5.那麼我很憂心的是,是否是全部方法都成了可能被併發的方法?
...
博主編程水平有限,團隊也很小,感受知識很難擴充。若是上述內容很白很菜(本身都這麼以爲,感受進了死衚衕又繞不出來),請一笑了之,也歡迎指點一二,感激涕零。
每天爲項目忙碌,感受本身的水平並無提升,迷茫ing...請各位指點迷津