我正在制作一个程序,它将db1中所有表的数据结合到db2中的一个表中。但它会导致死锁错误。使用并行复制表导致MySQL死锁
这是我的代码。
Parallel.ForEach(tableList, table =>
{
using (MySqlConnection conn = new MySqlConnection(DBconnection))
{
using (MySqlCommand cmd = new MySqlCommand(query, conn))
{
try
{
conn.Open();
cmd.CommandText = "INSERT INTO db2.targetTable (id, value1, value2) " +
"SELECT (SELECT id FROM db2.User u WHERE u.id = user LIMIT 1), " +
"value1, value2 FROM db1." + table;
cmd.CommandTimeout = 600000;
cmd.ExecuteNonQuery();
}
catch (Exception ex)
Console.WriteLine("ERROR : " + ex.Message);
}
}
}
我认为子查询会导致问题。
也许,如果我添加此代码,就可以解决这个问题:
Object sync = new Object();
lock (sync)
{
cmd.ExecuteNonQuery();
}
但我认为它是没有效率。这是一个正确的解决方案?或者有更好的解决方案,请给我一个示例代码。
你试图通过使用并行DML操作,以解决什么问题? – spencer7593