gpt4 book ai didi

c# - 使用 C# 在 Mysql 上出现死锁 - "Lock wait timeout exceeded; try restarting transaction"

转载 作者:行者123 更新时间:2023-11-30 00:49:00 25 4
gpt4 key购买 nike

我们可以像 SingleTon 一样使用此类来返回相同的连接和事务(隔离级别已提交读)(我们使用 CRUD):

public class SharedDbMySQL : DatabaseMySQL
{
private static DatabaseMySQL sConn;

private SharedDbMySQL()
{
}

public static DatabaseMySQL GetInstance()
{
return GetInstance(TipoDados.Dados);
}

public static DatabaseMySQL GetInstance(TipoDados OpcoesBD)
{
if (sConn == null)
sConn = new DatabaseMySQL(OpcoesBD);
return sConn;
}
}

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

public static void InsereAtualizaNotaFiscalEntradaProduto(List<nf_entrada_produto> entity, int IDNFEntrada, bool SharedConnection, bool LastOperation)
{
DatabaseMySQL db;
MySqlCommand cmd = new MySqlCommand();

if (SharedConnection)
db = SharedDbMySQL.GetInstance();
else
db = new DatabaseMySQL();

try
{
cmd.Connection = db.Conn;
cmd.Transaction = db.BeginTransaction();
ONF_Entrada_Produto OpNFProduto = new ONF_Entrada_Produto(cmd);
foreach (nf_entrada_produto Item in entity)
{
Item.ValorICMSST = 0;
Item.IDNFEntrada = IDNFEntrada;
Item.IDEmpresa = BusinessLogicLayer.ObjetosGlobais.DadosGlobais.EmpresaGlobal.ID;
if (Item.ID == 0)
{
if (!OpNFProduto.Add(Item))
throw OpNFProduto.LastError;
}
else
{
if (!OpNFProduto.Update(Item))
throw OpNFProduto.LastError;
}
}

if (LastOperation || !SharedConnection)
{
db.CommitTransaction();
db.Disconnect();
}
}
catch (Exception ex)
{
db.RollBackTransaction();
db.Disconnect();
throw ex;
}
}

错误发生在我们插入产品时(上面的代码)“超出锁定等待超时;尝试重新启动事务”。我们发现了一些有关死锁的信息...连接丢失可能是错误,如何解决它?我认为这是服务器错误?谢谢大家。

最佳答案

问题出在方法上...我再次创建了一个新连接,但没有从单例中获取它...数据库死锁,表和其他连接也尝试改变它......并且存在问题。

cmd.Connection = new db.Connect();
cmd.Connection = db.Conn;

替换为

cmd.Connection = db.Conn;

类 db 内部(单例):

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);
}
}

花了很多时间,因为很难发现错误...我们调试了很多次才找到它。

关于c# - 使用 C# 在 Mysql 上出现死锁 - "Lock wait timeout exceeded; try restarting transaction",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21139377/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com