C# e MySql - Deadlock found when trying to get lock; try restarting transaction
Gente boa tarde! Eu resolvi a pouco tempo atrás, integrar o software da empresa onde trabalho de SqlServer para MySql, devido a varias vantagens que li sobre o MySql (Incluindo o fato de ser livre). Porém, nessa mudança perdi um tempo medonho tentando descobrir porque dava a seguinte MySqlException na minha aplicação:
Erro 1213 - Deadlock found when trying to get lock; try restarting transaction
Problema:
Eu tenho uma aplicação que está toda hora atualizando uma determinada tabela no banco, e outras tantas aplicações que fazem a leitura da mesma tabela. O que acontece, é que quando você vai dar um UPDATE na tabela, a tabela é trancada, não podendo ser acessada naquele momento, ou seja, eu estava lendo mundo e atualizando muito em um curto intervalo de tempo, e isso causava VARIAS vezes essa maldita exceção..
Até onde eu li, esse tipo de coisa acontece com todos os bancos, não só com o MySql, porém é configurável, eu não tinha esse problema quando usava o SqlServer.
Até onde eu li, esse tipo de coisa acontece com todos os bancos, não só com o MySql, porém é configurável, eu não tinha esse problema quando usava o SqlServer.
Resolução:
Depois de tentar todo tipo de coisa, e fazer todo tipo de pesquisa, meu boss descobriu que tem uma variável no MySql onde você pode definir se a busca de dados será feita com os dados já comitados, ou seja, não da problema de acesso pois ele ignora o que está sendo comitado no momento em que a tabela está em lock.
Depois de tentar todo tipo de coisa, e fazer todo tipo de pesquisa, meu boss descobriu que tem uma variável no MySql onde você pode definir se a busca de dados será feita com os dados já comitados, ou seja, não da problema de acesso pois ele ignora o que está sendo comitado no momento em que a tabela está em lock.
Script para alterar a variavel:
SET GLOBAL TX_ISOLATION='READ-UNCOMMITTED';
Esse SCRIPT funciona, só que tem um porém, quando inicia a instancia do MySql, a variavel volta para o valor default, para isso não acontecer deve ser alterada no arquivo MySql.ini ou se você usa o Workbench, vá em Options File/Advanced, selecione a variavel transaction-isolation e mude o valor dela para READ-UNCOMMITED
Ex:
Dessa forma você libera a leitura da tabela mesmo quando ela esta em lock e não se incomoda mais com esses Deadlock do capiroto..
É possivel também fazer pela aplicação :
ResponderExcluirMySqlTransaction transaction
cmd = new MySqlCommand("insert into cliente(nome)values('Caroline')";
transaction = connection.BeginTransaction(IsolationLevel.ReadUncommitted);
cmd.Transaction = transaction;
cmd.ExecuteNonQuery();
transaction.Commit();