我有一個靜態方法,它在Parallel.ForEach循環中的靜態方法內調用SQL SP。 SP將數據插入3個不同的表格中。我正在使用可序列化交易級別。但是偶爾我會遇到死鎖情況。Parallel.ForEach中的SQL查詢 - 死鎖
我在想,如果我將該方法作爲Instance方法或使用簡單的ForEach,它可能會解決問題。
我在想對不對?我是否也需要鎖定列表?
--Code--
Parallel.ForEach(MyConcurrentDictionary, MyElement =>
{
if (MyElement.SomeProperty != SomeValue)
{
PublishMessage(MyElement);
}
else
{
InsertInDatabase(MyElement);
}
}
public static void InsertInDatabase()
{
DataTable t1 = new DataTable();
DataTable t2 = new DataTable();
DataTable t3 = new DataTable();
CreateTable(T1);
CreateTable(T2);
CreateTable(T3);
using (var conn = new SqlConnection(ConnString))
{
try
{
conn.Open();
// Begin transaction
using (SqlTransaction transaction = conn.BeginTransaction(IsolationLevel.Serializable))
{
SqlCommand cmd = new SqlCommand();
cmd.Transaction = transaction;
cmd.Connection = conn;
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = "SPName";
cmd.Parameters.AddWithValue("@T1", T1);
cmd.Parameters.AddWithValue("@T2", T2);
cmd.Parameters.AddWithValue("@T3", T3);
cmd.ExecuteNonQuery();
transaction.Commit();
}
}
}
}
你在一次交易中運行所有這一切嗎? – 2011-06-01 14:14:19
@Johann Blais - 每個元素創建自己的交易。事務在Parallel.ForEach中創建。 – Asdfg 2011-06-01 14:16:55
這可能不值得多線程。如果你正在做SQL插入,你可能會比CPU綁定更多的IO綁定。 – 2011-06-01 14:16:56