Estou com um pequeno problema e espero que o pessoal do GUJ possam me ajudar.
É o seguinte… utilizando o Struts/Hibernate/MySQL quando eu dou um save em duas tabelas funciona perfeitamente.
Quando eu forço um erro em uma delas e assim dou um RollBack, também funciona (ou seja, não ocorre o cadastro por causa do RollBack).
O problema é que quando eu faço um novo cadastro, o meu campo id nas duas tabelas sofrem um auto-incremento de 2, e não de 1. Por que isso? Será que por causa do RollBack o MySQL faz um auto-incremento a mais não necessário?
Como posso resolver isso?
Obs.: Estou usando ThreadLocal para o Session e para o Transaction. É como se no RollBack a Thread continuasse ativa segurando um incremento do ID das tabelas.
O mysql quando insere em uma tabela com autoincrement gera esse id fora da transação, logo é não sofre rollback. Esse comportamento é correto e não tem muito sentido querer alterar ele.
[quote=the_negao]Não imaginei que esse comportamento você normal, uma vez que se perde muitos id.
Mas valeu… agradeço a atenção!
[/quote]
É bem simples entender porque esse comportamente é meio óbvio. Um banco de dados suporta acesso concorrente.
Imagine que 10 clientes simultâneos inserem nessa tabela, de 1 a 10. Os ids dos registros vão de 1 a 10. Os clientes 2 e 7 dão rollback. Qual o próximo id a ser retornado?
Dúvida: Mas em algum momento o Banco de Dados visualiza essas lacuna em branco e passa a preenchê-las?
[/quote]
Claro que não, não faz o menor sentido também. Uma coluna autoincrement sempre fica subindo de valor. Não vale a pena pro banco sair procurando por números perdidos e guardar eles.
Não confunda os valores das colunas com a representação dos dados em disco. Valores de sequences são só isso, valores. Não é porque existe um buraco entre dois valores que existe espaço em disco inutilizado.