Saya memiliki metode statis yang memanggil SQL SP di dalam metode statis dalam loop Parallel.ForEach. SP memasukkan data dalam 3 tabel berbeda. Saya menggunakan level Transaksi Serializable. Namun sesekali saya mengalami situasi Deadlock.
Saya berpikir jika saya menjadikan metode itu sebagai metode Instance atau menggunakan ForEach sederhana, ini mungkin dapat memperbaiki masalah.
Apakah pemikiranku benar? Apakah saya perlu mengunci daftarnya juga?
--Kode--
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();
}
}
}
}
IsolationLevel.Serializable
ITU JAHAT!!! Ini adalah pengaturan paling intensif kunci yang bisa Anda dapatkan. Apakah kamu yakin menginginkan ini? Saya ragu Anda melakukannya... Serializable di Sql Server akan meningkatkan kunci dengan sangat cepat ke rentang dan kunci tabel. Jika Anda memiliki throughput apa pun, kebuntuan pasti akan terjadi.ReadCommitted
adalah yang Anda cari, dan ini adalah level isolasi default di server Sql,Serializable
adalah level default di .Net. - person Didaxis   schedule 07.10.2013