Por que eu preciso do Transaction no Hibernate para operações somente leitura?
A transação a seguir bloqueia o BD?
Código de exemplo para buscar no banco de dados:
Transaction tx = HibernateUtil.getCurrentSession().beginTransaction(); // why begin transaction?
//readonly operation here
tx.commit() // why tx.commit? I don't want to write anything
Posso usar em session.close()
vez de tx.commit()
?
java
database
hibernate
transactions
database-connection
user93796
fonte
fonte
Respostas:
Você pode realmente ter motivos para marcar as transações como somente leitura.
autocommit=true
se uma opção diferente não for definida explicitamente.@Transactional(readonly=true)
, o Spring definirá a transação JDBC em um modo somente leitura, portanto, você ditará se é realmente possível gravar no banco de dados no escopo desta transação. Se sua arquitetura é complicada e alguns membros da equipe podem optar por colocar a consulta de modificação onde não é esperada, este sinalizador apontaria para o local problemático.Resumindo - você pode seguir os dois caminhos, mas precisa entender as consequências.
fonte
Todas as instruções do banco de dados são executadas no contexto de uma transação física, mesmo quando não declaramos explicitamente os limites da transação (BEGIN / COMMIT / ROLLBACK).
Se você não declarar os limites da transação explicitamente, cada instrução terá que ser executada em uma transação separada (
autocommit
modo). Isso pode até mesmo levar à abertura e fechamento de uma conexão por instrução, a menos que seu ambiente possa lidar com vinculação de conexão por thread.Declarar um serviço como
@Transactional
fornecerá uma conexão para toda a duração da transação e todas as instruções usarão essa única conexão de isolamento. Isso é muito melhor do que não usar transações explícitas em primeiro lugar.Em aplicativos grandes, você pode ter muitas solicitações simultâneas e reduzir a taxa de solicitação de aquisição de conexão com o banco de dados definitivamente melhorará o desempenho geral do aplicativo.
JPA não impõe transações em operações de leitura. Apenas as gravações acabam lançando uma exceção de transação necessária caso você se esqueça de iniciar um contexto transacional. No entanto, é sempre melhor declarar os limites da transação, mesmo para transações somente leitura (no Spring
@Transactional
permite marcar transações somente leitura, o que tem um grande benefício de desempenho).fonte
As transações, de fato, colocam bloqueios no banco de dados - bons mecanismos de banco de dados lidam com bloqueios simultâneos de maneira sensata - e são úteis com uso somente leitura para garantir que nenhuma outra transação adicione dados que tornem sua visualização inconsistente. Você sempre deseja uma transação (embora às vezes seja razoável ajustar o nível de isolamento, é melhor não fazer isso no início); se você nunca grava no banco de dados durante a transação, tanto o commit quanto o rollback da transação serão iguais (e muito baratos).
Agora, se você tiver sorte e suas consultas no banco de dados forem tais que o ORM sempre as mapeia para consultas SQL únicas, você pode escapar sem transações explícitas , contando com o comportamento de autocommit integrado do banco de dados, mas os ORMs são sistemas relativamente complexos portanto, não é nada seguro confiar em tal comportamento, a menos que você trabalhe muito mais para verificar o que a implementação realmente faz. Escrever os limites explícitos da transação é muito mais fácil de acertar (especialmente se você pode fazer isso com AOP ou alguma técnica orientada por ORM semelhante; do Java 7 em diante, tente com recursos também pode ser usado, suponho).
fonte
Não importa se você apenas lê ou não - o banco de dados ainda deve manter o controle de seu conjunto de resultados, porque outros clientes de banco de dados podem querer gravar dados que alterariam seu conjunto de resultados.
Tenho visto programas com falha para matar sistemas de banco de dados enormes, porque eles apenas leem os dados, mas nunca confirmam, forçando o log de transações a crescer, porque o banco de dados não pode liberar os dados da transação antes de um COMMIT ou ROLLBACK, mesmo se o cliente não fez nada por horas.
fonte