我的代碼是用C#編寫的,數據層使用LINQ to SQL來填充/加載分離的對象類。LINQ to SQL DAL,這是線程安全嗎?
我最近更改了代碼以使用多線程,並且我非常確定我的DAL不是線程安全的。
你能告訴我,如果PopCall()和Count()是線程安全的,如果不是我如何解決它們?
public class DAL
{
//read one Call item from database and delete same item from database.
public static OCall PopCall()
{
using (var db = new MyDataContext())
{
var fc = (from c in db.Calls where c.Called == false select c).FirstOrDefault();
OCall call = FillOCall(fc);
if (fc != null)
{
db.Calls.DeleteOnSubmit(fc);
db.SubmitChanges();
}
return call;
}
}
public static int Count()
{
using (var db = new MyDataContext())
{
return (from c in db.Calls select c.ID).Count();
}
}
private static OCall FillOCall(Model.Call c)
{
if (c != null)
return new OCall { ID = c.ID, Caller = c.Caller, Called = c.Called };
else return null;
}
}
獨立式OCall類:
public class OCall
{
public int ID { get; set; }
public string Caller { get; set; }
public bool Called { get; set; }
}
謝謝! ,似乎你使用TrasactionScope,因爲它是一個鎖定語句,我認爲TrasactionScope只能確保「全部或全部」SQL查詢執行。它是否也阻止其他線程? – RuSh 2010-08-25 11:43:23
@sharru - 數據庫在可序列化隔離時執行該操作。如前所述,UPDLOCK會更好地避免更多的時間邊緣情況。 – 2010-08-25 17:17:38