Auto-incremento a mais após RollBack

Pessoal,

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?

Agradeço…

Oh Pessoal,

Alguém me ajuda, por favor!

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.

Aguardo uma preciosa ajuda!

Tá funcionando direito isso, qual sua dúvida?

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.

É o mesmo comportamento da ‘sequence’ do Oracle e do ‘auto identity’(acho que é isso) do Sql Server.

Não imaginei que esse comportamento você normal, uma vez que se perde muitos id.

Mas valeu… agradeço a atenção!

[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?

É… realmente…

Agora ficou bem claro!

Dúvida: Mas em algum momento o Banco de Dados visualiza essas lacuna em branco e passa a preenchê-las?

[quote=the_negao]É… realmente…

Agora ficou bem claro!

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.

As idéias agora ficaram bem claras.

Valeu louds, um abraço, cara!