程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> 小記:事務(進程 ID 56)與另一個進程被死鎖在 鎖 | 通信緩沖區 資源上,並且已被選作死鎖犧牲品。,小記作死

小記:事務(進程 ID 56)與另一個進程被死鎖在 鎖 | 通信緩沖區 資源上,並且已被選作死鎖犧牲品。,小記作死

編輯:C#入門知識

小記:事務(進程 ID 56)與另一個進程被死鎖在 鎖 | 通信緩沖區 資源上,並且已被選作死鎖犧牲品。,小記作死


今天在做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);
    }
});

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved