JPA..duvida referente ao uso de Transaction

Olá ,
uma duvida referente a transaction no exemplo abaixo
vou dar um select no banco e logo seguida vou dar commit.

Eu sei que select não é seguido de commit mas estou em duvida referente
se der um erro na hora do select , ou essa linha estar sendo atualizado …

Está certo ou errado usar assim ???

se alguém puder me ajudar agradeceria…

abs


        try {              
        	   transaction.begin();
        	   lista = this.imsDBMng.getManager().createQuery("select u from ImsDeviceImpl u").getResultList();
        	   transaction.commit();
        } catch (Exception e) {
        	transaction.rollback;
        	throw new ImsDaoException(DEVICE_QUERY_ERROR, "Query error", e);
        } finally {
            //manager.close();
        }

        return lista;

Ola boa tarde, não precisa de transaction para fazer consulta, porque você simplesmente não esta alterando nada no banco de dados, o maximo que pode acontecer se você estiver fazendo uma consulta e alguem estiver atualizando os dados e esse processo foi inicializado primeiro do que a consulta e não retornar valores, ou o contrario se você estiver consultado dados e alguem tentar fazer um updade ele não vai conseguir.

Geralmente esse tipo de política é implementada pelo SGBD, então no caso da consulta, o que pode acontecer é uma NoResultException dizendo que a consulta não retornou valores.

att

Olá pessoal …

Bom, aproveitando que o tópico ainda é " meio recente ", eu passei por uma situação que só consegui resolver usando transaction na consulta, e vou aproveitar para expor essa situação…

Antes de mais nd, eu uso o postgre de SGBD, para obter a hora do servidor eu uso a funcao " select localtimestamp(0) " e uso o framework de persistencia Hibernate.

O problema:

Por exemplo, na tabela venda que possui um campo datavenda, quando eu salvo varias vendas sem fechar a tela, o horario da venda nao se repete…
Ja na tela pra gerar relatorio de lancamentos, ela busca a data/hora atual do servidor, mas se eu mandasse gerar 10 relatorios sem fechar a tela, os 10 relatorios tinham a mesma data de geração…

A funcao " select localtimestamp(0) ", na verdade nao retorna a data/hora atual, neim os outros comandos relacionados como o current timestamp(0) por exemplo, essas funcoes retornam a data/hora do inicio da transacao. Entao o que acontecia era que o metodo salvar, iniciava uma transacao salvava o objeto e logo em seguida fazia um commit, finalizando a transacao, fazendo com que o proximo objeto a ser salvo, iniciasse uma nova transacao e com isso obtendo a data/hora atual. Ja na geracao do relatorio, na primeira consulta, era iniciada um objeto Session, sem associar ela a um objeto Transaction.

Entao se eu mandasse gerar um relatorio as 10:00 o primeiro iria sair com a data certa, mas o segundo relatorio vamos supor, as 10:05, tbem iria sair com o horario das 10:00, pq a transacao foi iniciada as 10:00 e nao foi finalizada, entao o que eu fiz foi associar esse objeto Session a um objeto Transaction, e fazer um beginTransaction(), antes de mandar consultar, e após a consulta é feito um commit(), caso seja lancada alguma excessao, um rollback().

Eu também achei estranho fazer dessa forma, mas se a gnt parar pra analizar, um transaction, é uma transacao, uma comunicacao com o banco de dados, e vc pode querer finalizar essa transacao, como aconteceu comigo, nessa questao da data atual ai…

Gostaria de saber a opiniao de vcs referente a solução que fiz, posso continuar usando isso, ou nao esta correto fazer dessa forma…

vlw t+