Depois de me recuperar de um problema de disco cheio, comecei a receber estes erros em meus logs:
java.sql.BatchUpdateException: Deadlock found when trying to get lock; try restarting transaction
at com.mysql.jdbc.PreparedStatement.executeBatchSerially(PreparedStatement.java:1684)
at com.mysql.jdbc.PreparedStatement.executeBatch(PreparedStatement.java:1108)
at com.dappit.Dapper.adminer.pixelMaster.storage.RemotePixelStorage.flushBufferToDb(RemotePixelStorage.java:120)
...
O código Java ( RemotePixelStorage.java:120
):
(119) connection.setAutoCommit(false);
(120) int[] returnCodes = pstmt.executeBatch();
(121) connection.setAutoCommit(true);
(122) connection.commit();
Cada instrução é uma chamada para o procedimento armazenadoadd_pixel
, que adiciona um elemento a uma tabela e remove os elementos mais antigos, se necessário.
O que essa exceção jdbc significa? Como posso superar esse problema? Devo simplesmente tentar confirmar algumas vezes com um bloco catch?
Olhando para o procedimento armazenado, vejo algo bastante antinatural.
O que vejo que não é natural é a
DELETE ... JOIN
consulta que está misturando uma tabela InnoDB e uma tabela MyISAM. Tais JOINs tendem a ser bastante desajeitados para o mysqld .Vamos fazer a
pixel_window
mesa. InnoDB. Na verdade, não vamos torná-la uma tabela temporária. Claro, a parte difícil é criar umapixel_window
tabela única para a sessão. A tabela temporária pixel_window terá o prefixo 'pixel_window_' com o ID de conexão anexado.De uma chance !!!
CAVEAT: Desde que criei este monstro, também precisava matá-lo.
Você diz que acabou de se recuperar de uma condição de 'disco cheio'.
Você também nunca disse quais outros processos/programas acessam esses dados.
Precisamos de uma enumeração de outros programas de acesso porque eles podem ser a origem do impasse .
Lembre -se de que impasse significa acesso competitivo , especialmente para escrita.
Agora... considere suas qualidades ACID : Atomicidade, Consistência, Durabilidade e Isolamento ....