C# e MySql - Deadlock found when trying to get lock; try restarting transaction

10:06 Unknown 1 Comments

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.

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.

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..

Um comentário:

  1. É possivel também fazer pela aplicação :
    MySqlTransaction transaction
    cmd = new MySqlCommand("insert into cliente(nome)values('Caroline')";
    transaction = connection.BeginTransaction(IsolationLevel.ReadUncommitted);
    cmd.Transaction = transaction;
    cmd.ExecuteNonQuery();
    transaction.Commit();


    ResponderExcluir