我有这样的错误
超出锁定等待超时 尝试重新启动事务
也许我不明白。但是如果我设置 CommandTimeout=1000 或更高,我有一个解决方案。我还没有在生产中尝试过。但我想听听对此的任何意见。
// 40 lines of command.Parameters here
command.Parameters.AddWithValue("sample1", sam1);
command.Parameters.AddWithValue("sample2", sam2);
command.Parameters.AddWithValue("sample3", sam2);
try
{
command.ExecuteNonQuery();
}
catch (MySqlException mex)
{
我间歇性地收到"超过锁定等待超时尝试重新启动事务"。然后我开始将所有内容包装在事务中,并且不再收到这些错误。这应该可以防止在执行查询后保留表锁。
(假设"conn"是MySqlConnection,"iLevel"是要使用的隔离级别,"query"包含您的查询作为字符串(
int rowCount = 0; // In case you want the number of rows affected
try
{
if (conn.State != ConnectionState.Open)
conn.Open();
MySqlCommand command = new MySqlCommand(query, conn);
using(var transaction = conn.BeginTransaction(iLevel))
{
command.Transaction = transaction;
command.CommandTimeout = int.MaxValue;
// Set parameters etc...
try
{
rowCount = command.ExecuteNonQuery();
transaction.Commit();
}
catch(Exception ex)
{
transaction.Rollback();
// Handle query exception...
}
}
}
catch(Exception ex)
{
// Handle general exception...
}
您可以尝试(仅用于测试目的(设置事务隔离级别 ="已提交读取",如果失败,请尝试设置为"读取未提交"MySql 参考检查死锁:
"显示引擎INNODB状态"从MySQL命令行客户端(不是 查询浏览器(将为您提供有关死锁的信息。
死锁也可能是由未提交的事务引起的(通常 程序错误(和运行未提交的人 事务将看不到问题,因为它们将正常工作 (通过他们的数据不会被提交(。 从这里引用