今天在做SQL并發UPDATE時遇到一個異常:(代碼如下)
//Parallel 類可產生并發操作(即多線程)Parallel.ForEach(topics, topic =>{ //DBHelper是一個封裝的數據庫操作類,下面這行代碼將執行UPDATE語句 DBHelper.Update(topic, "TopicID=" + topic.TopicID);});
出現此問題的原因是,在SQLServer默認情況下,一條SQL語句就是一個事務。而在多線程同時UPDATE時,會同時產生多個事務,A事務等待B事務結束,B事務等待A事務結束,則造成了死鎖。
解決方法:lock 加鎖 (即:在多個線程同時訪問 lock 代碼區時,只允許一個線程進入,其他線程處于等待狀態)
//聲明靜態只讀鎖對象PRivate static readonly object o = new object();Parallel.ForEach(topics, topic =>{ //加鎖 lock (o) { //同一時刻僅能有一個線程進入 DBHelper.Update(topic, "TopicID=" + topic.TopicID); }});
新聞熱點
疑難解答