Phantom Reads

O que são phantom reads? pq abrir uma transação para uma consulta? qual a vantagem disto???

http://www.hibernate.org/hib_docs/v3/reference/en/html/transactions.html#transactions-demarcation

Isso é bem estranho e/ou complexo de se entender e/ou aceitar.

Ele fala de auto-commit mode, mas auto-commit é só para WRITE (update/insert/delete) operations. Quando vc trabalha com JDBC, vc não ABRE uma transação. Vc apenas desliga o auto-commit e vai dando commit ou rollback conforme necessário. <editado>Parece que quando vc desliga o auto_commit vc automaticamente abre uma transação</editado>.

Eu já usei Oracle e MySQL nos seus Isolation Levels padrões, e isso não é necessário. Pode haver outros isolations levels onde isso se faz necessário.

Bom, isso me parece uma complexidade da qual eu não deveria ter que me preocupar. Se o Hibernate acha que uma transação tem que estar presente pra tudo, ele mesmo deveria abrir e fechar uma transação quando a session é aberta e fechada. Dessa maneira o usuário não precisaria se preocupar com isso e nem quebrar a cabeça para entender isso. Se o cara quisesse assumir a transação, bastaria ele pegá-la da session. :roll:

É exatamente o que fazemos com o HibernateFilter no mentawai. Ele possui um transactional mode, ou seja, se vc ativar esse transaction mode, sempre que ele abrir uma session ele vai também abrir uma transação. E sempre que ele for fechar a session ele vai commitar tb a transação. Isso se ela ainda estiver lá e se ainda não roi comitada ou rollbackeada por ninguém, ou seja, num caso de um update vc pode pegar a transação e comitá-la /rolbacká-la vc mesmo.

O modo transacional é OPCIONAL E NÃO DEFAULT, ou seja, se vc quiser, vc pode fazer como o hibernate sugere: abra uma transação pra tudo, até para select e não esquece de dar commit no final. Como isso nos pareceu bastante repetitivo, principalmente para os READ (select), fizemos o transactional mode para o HibernateFilter.

http://forum.hibernate.org/viewtopic.php?p=2374305#2374305

Tive um caso meio louco ao persistir no entitymanager em série várias entidades.

Quando o processo estava sendo executado inesperadamente o Hibernate fechava a transação e como conseqüência ele não poderia comitar ou prosseguir com os commits.

Então sempre que antes de persistir um método estático coloquei para verificar a transação e então abrir caso fosse necessário, então o problema tinha sido resolvido.

A questão louca é… pq diabos o hibernate fechou uma transação que já estava aberta sem nenhuma solicitação anterior? Até hoje o ghost percorre.