ฉันมีวิธีการคงที่ซึ่งเรียก SQL SP ภายในวิธีการคงที่ใน Parallel.ForEach loop SP แทรกข้อมูลใน 3 ตารางที่แตกต่างกัน ฉันกำลังใช้ระดับธุรกรรมแบบอนุกรม แต่บางครั้งฉันก็ประสบปัญหาการหยุดชะงัก
ฉันคิดว่าถ้าฉันสร้างวิธีนั้นเป็นวิธีอินสแตนซ์หรือใช้ ForEach แบบธรรมดาก็อาจแก้ไขปัญหาได้
ฉันคิดถูกหรือเปล่า? ฉันจำเป็นต้องล็อครายการด้วยหรือไม่?
--รหัส--
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
ชั่วร้าย!!! เป็นการตั้งค่าที่เน้นการล็อคมากที่สุดที่คุณจะได้รับ คุณแน่ใจหรือว่าต้องการสิ่งนี้? ฉันสงสัยว่าคุณทำ ... Serializable ใน Sql Server จะเพิ่มการล็อคอย่างรวดเร็วไปยังช่วงและการล็อคตาราง หากคุณมีปริมาณงานใดๆ การหยุดชะงักจะต้องตามมาอย่างแน่นอนReadCommitted
คือสิ่งที่คุณกำลังมองหา และเป็นระดับการแยกเริ่มต้นในเซิร์ฟเวอร์ SqlSerializable
คือระดับเริ่มต้นใน .Net - person Didaxis   schedule 07.10.2013