使用C#-”在Mysql上死锁;超过锁定等待超时;尝试重新启动事务“;

使用C#-”在Mysql上死锁;超过锁定等待超时;尝试重新启动事务“;,c#,mysql,sql,singleton,deadlock,C#,Mysql,Sql,Singleton,Deadlock,我们像SingleTon一样使用这个类来返回相同的连接和事务(隔离级别readcommitted)(我们使用CRUD): 使用SQL(microsoft)。。。这个错误不会发生。。。只有Mysql。 我们首先插入“NotaFiscalEntrada”。。。 在我们将此“NotaFiscalEntrada”的产品插入此方法后(此处有错误): public static void insreatualizanotafiscalentradaproduto(列表实体、int-IDNFEntrada、b

我们像SingleTon一样使用这个类来返回相同的连接和事务(隔离级别readcommitted)(我们使用CRUD):

使用SQL(microsoft)。。。这个错误不会发生。。。只有Mysql。 我们首先插入“NotaFiscalEntrada”。。。 在我们将此“NotaFiscalEntrada”的产品插入此方法后(此处有错误):

public static void insreatualizanotafiscalentradaproduto(列表实体、int-IDNFEntrada、bool-SharedConnection、bool-LastOperation)
{
数据库数据库;
MySqlCommand cmd=新的MySqlCommand();
if(共享连接)
db=SharedDbMySQL.GetInstance();
其他的
db=newdatabasemysql();
尝试
{
cmd.Connection=db.Conn;
cmd.Transaction=db.BeginTransaction();
ONF_Entrada_Produto OpNFProduto=新ONF_Entrada_Produto(cmd);
foreach(实体中的nf_entrada_produto项目)
{
Item.ValorICMSST=0;
Item.IDNFEntrada=IDNFEntrada;
Item.IDEmpresa=BusinessLogicLayer.ObjetosGlobais.DadosGlobais.EmpresaGlobal.ID;
如果(Item.ID==0)
{
如果(!OpNFProduto.Add(项目))
抛出OpNFProduto.LastError;
}
其他的
{
如果(!OpNFProduto.Update(项目))
抛出OpNFProduto.LastError;
}
}
if(上次操作| |!共享连接)
{
db.CommitTransaction();
db.Disconnect();
}
}
捕获(例外情况除外)
{
db.RollBackTransaction();
db.Disconnect();
掷骰子;
}
}
错误发生在我们插入产品时(上面的代码) “已超过锁定等待超时;请尝试重新启动事务”。
我们找到了一些关于僵局的东西。。。连接丢失可能是错误,如何解决?我认为这是服务器错误?谢谢大家。

问题出在方法上。。。我再次创建了一个新的连接,并没有从singleton中获取它。。。 数据库死锁表和其他连接也试图改变它。。。这就是问题所在

cmd.Connection = new db.Connect();
cmd.Connection = db.Conn;
替换为

cmd.Connection = db.Conn;
类db内部(单例):


这花了很多时间,因为很难看到错误。。。我们对它进行了多次调试以找到它。

您的等待超时设置是什么?最长可达30秒。。。我们改变了它。。。到1分钟。。。但同样的错误我和一个朋友谈过。。。他向我解释说DatabaseSQLServer db=newdatabasesqlserver();有一件事。。。SqlCommand cmd=newsqlcommand();是其他。。。我们使用相同的数据库,但每次都会创建cmd。。对于死锁问题,如果我们使用相同的CMD。。。。我们正在尝试,您可以运行query
显示引擎INNODB状态吗?这应该更准确地告诉我们死锁是什么…如果它有大量的事务,尝试更频繁地提交,那么锁处于活动状态的时间就更少了。出于某种原因。。。问题只出现在MYSQL上。。。MSSQL上没有错误。。。我认为MSSQL级别与c#的交互有一种机制可以出于某种原因解决类似的问题。
cmd.Connection = new db.Connect();
cmd.Connection = db.Conn;
cmd.Connection = db.Conn;
MySqlConnection conn;

public MySqlConnection Conn
        {
            get
            {
                if ((conn == null) || (conn.State == System.Data.ConnectionState.Closed))
                {

                    Connect();
                }

                return conn;
            }
            set
            {
                conn = value;
            }
        }

public override void Connect()
        {
            RetornaDadosIniParaClasse();
            conn = new MySqlConnection(StringConnection);

            try
            {
                conn.Open();

                if (conn.State == System.Data.ConnectionState.Closed)
                {
                    throw new AccessDatabaseException("Conexão com o banco de dados firebird fechada");
                }
            }
            catch (Exception ex)
            {
                throw new AccessDatabaseException(ex.Message);
            }
        }