[Duvida] - MySQL + Transaction

Olá pessoal,

Depois de apanhar muito, consegui fazer funcionar meu projetinho, agora eu acabei de ver uma coisa curiosa, que eu gostaria de saber se realmente funciona do modo que está ou se está faltando alguma configuração.

Bom, deixa eu explicar o que eu tenho aqui, tenho meu projeto usando VRaptor e Hibernate, to com o MySQL com as tabelas utilizando InnoDB, o fato que estou curioso é o seguinte, quando dá algum problema e acontece o rollback da transaction, o indice na tabela não se mantem igual, por exemplo, o id é == 1, fiz a operação e aconteceu o rollback, ai depois faco outra operação que não tem rollback e o indice foi para 3, ou seja, no rollback ele adicionou um no indice e não subtraiu quando fez o rollback, isto está certo ?

Muito obrigado

Att.
Leonardo Lima

Olá,

É isto mesmo, o gerador de IDs não é afetado pelo rollback da sua aplicação. Isto tem a ver com a implementação interna do banco de dados, mas não é difícil imaginar um cenário onde fazer o rollback do ID seria problemático.

Imagine duas transações A e B fazendo inserts numa mesma tabela. Agora digamos que os eventos acontecem na seguinte ordem:

  1. O BD dá para A o ID 10
  2. O BD dá para B o ID 11
  3. A termina com sucesso e faz commit
  4. B falha e o rollback é feito

Se o rollback da geração do ID fosse feito após o passo 4, o próximo ID a ser atribuído iria de 11 para 10. Só que perceba que 10 já foi utilizado! Isto causaria problemas sérios, já que no próximo insert o BD geraria um ID que já está sendo utilizado.

Abraço