Académique Documents
Professionnel Documents
Culture Documents
Uma transao uma unidade de trabalho que no pode ser dividida. uma operao atmica. H dois nveis de granularidade em aplicaes corporativas
A maior parte da complexidade de se lidar com transaes ocultada pelo sistema (Hibernate, servidor de aplicaes, banco de dados)
Transaes de banco de dados Transaes longas (de aplicao): envolvem vrias transaes de banco de dados
Uma transao ou termina com sucesso (commit) ou desfaz todo o processo (rollback)
Transaes em servidores
Demarcar transaes em uma aplicao JDBC fcil. Basta configurar a Conexo conn com da seguinte forma
conn.setAutoCommit(false);
Os statements executados sero acumulados e s sero tornados definitivos no banco aps um conn.commit() Ou sero desfeitos caso ocorra um conn.rollback() Em servidores de aplicao, ou quando preciso realizar transaes entre vrios bancos, preciso usar o protocolo Two-phase commit, que gerencia o processo
Para isto existe a API JTA e a classe UserTransaction que encapsula transaes distribudas
dentro da transao
Transaes no Hibernate
O Hibernate encapsula o sistema de transaes do banco (JDBC) ou servidor (ambiente gerenciado) usado A transao comea na Session com uma chamada para
session.beginTransaction() Em um ambiente no gerenciado, isto inicia uma transao JDBC na conexo. Em um ambiente gerenciado, inicia uma transao JTA ou une-se transao existente.
tx.commit() sincroniza o estado da sesso com o banco de dados. tx.rollback() ou desfaz imediatamente a transao ou marca a transao para rollback.
importante fechar a sesso em um bloco finally para garantir que a conexo JDBC ser liberada e retornada ao pool de conexes.
Flushing (descarregando)
Mudanas ao modelo de domnio no so imediatamente persistidas no banco (para reduzir acesso ao banco) Gravao/sincronizao transparente dos dados no final da transao.
Uma transao cometida s vezes, antes que uma query executada Quando a aplicao chama explicitamente session.flush()
Isolamento
Variam de isolamento completo a isolamento praticamente inexistente (neste caso, cabe aplicao lidar com os conflitos)
Para a maior parte das aplicaes, isolamento incompleto de uma transao aceitvel
Problemas de isolamento
O padro ANSI SQL define os nveis de isolamento de transaes em termos de fenmenos que podem ou no serem permitidos. Os fenmenos so: Update perdido (lost update)
Duas transaes ambas atualizam um registro e a segunda transao aborta, fazendo com que as duas mudanas sejam perdidas. As transaes concorrentes no tm isolamento algum. Uma transao l mudanas feitas por transao que ainda no cometeu os dados. Essa mudana pode ser desfeita em um rollback.
Problemas de isolamento
Uma transao l um registro duas vezes e obtm um estado diferente em cada leitura. Outra transao pode ter gravado dados e cometido mudanas entre as duas leituras Uma transao executa uma consulta duas vezes, e o segundo resultado inclui registros que no estavam na primeira consulta. Novos registros foram inseridos por outra transao entre as consultas.
Permite dirty reads mas no updates perdidos. Uma transao no pode gravar em um registro se outra transao no cometida j gravou dados nele. Este nvel de isolamento pode ser implementado com locks de gravao exclusiva.
Read committed
Permite unrepeatable reads mas no dirty reads. Transao de gravao no cometida impede que outras transaes acessem registro. Transaes de leitura no bloqueiam o sistema.
Repeatable read
No permite unrepeatable reads nem dirty reads. Podem ocorrer phantom reads. Transaes de leitura bloqueiam transaes de gravao (mas no outras transaes de leitura) e transaes de gravao bloqueiam todas as outras.
Serializable
Fornece o isolamento mais rigoroso. Emula execuo em srie de transaes (em vez de concorrentemente).
Isolamento excessivo geralmente no aceitvel, devido ao alto custo quanto escalabilidade (crtica nas aplicaes tpicas do Hibernate), portanto o isolamento serializable no deve ser usado O isolamento read uncommitted perigoso, e no deve ser usado se houver opes melhores no banco Suporte a versioning (travas otimistas) e uso do cache de segundo nvel (por classe) do Hibernate j alcanam a maior parte dos benefcios de um isolamento do tipo repeatable read, usando read committed.
1Read uncommitted isolation 2Read committed isolation 4Repeatable read isolation 8Serializable isolation Servidores de aplicao tm configurao prpria.
Mas pode ser desejvel utilizar travas mais rigorosas para transaes especficas Existem duas estratgias
Travas pessimistas (evita colises entre transaes bloqueando totalmente o acesso de outras transaes) Travas otimistas (onde o sistema flexibiliza o isolamento mas lida com eventuais colises)
Travas pessimistas
Uma trava pessimista adquirida quando dados so lidos e mantidos isolados de outras transaes at que a sua transao complete.
Em modo read-committed, o banco de dados nunca adquire travas pessimistas a no ser que sejam requisitadas explicitamente Permite a solicitao de uma trava pessimista em um objeto
Transaction tx = session.beginTransaction(); Category cat = (Category) session.get(Category.class, catId); cat.setName("New Name"); tx.commit();
Classe LockMode
Considere a seguinte transao Uma trava pessimista pode ser obtida da seguinte forma:
Transaction tx = session.beginTransaction(); Category cat = (Category) session.get(Category.class, catId, LockMode.UPGRADE); cat.setName("New Name"); tx.commit();
Controle de LockMode
NONE - S vai ao banco se o objeto no estiver no cache. Default em load() e get() READ - Ignora cache e faz verificao de verso para assegurar-se que o objeto na memria o mesmo que est no banco. UPDGRADE - Ignora cache, faz verificao de verso (se aplicvel) e obtm trava pessimista (se suportada). UPDGRADE_NOWAIT - Mesmo que UPGRADE, mas desabilita a espera por liberao de travas, e provoca exceo de locking se a trava no puder ser obtida. WRITE - Obtida automaticamente quando Hibernate grava em um registro na transao atual
Controle de LockMode
Processos de negcio
Podem ser consideradas uma nica unidade de trabalho do ponto de vista de um usurio. Transao de baixa granularidade. Uma noo mais abrangente da unidade de trabalho. Dados so recuperados e mostrados na tela em uma primeira transao do banco O usurio tem uma oportunidade de visualizar e modificar os dados, fora de uma transao As modificaes so feitas persistentes em uma segunda transao de banco de dados
3)
Trs estratgias
ltimo commit ganha - os dois updates funcionam, mas o segundo sobrescreve as alteraes do primeiro. Nenhuma mensagem de erro mostrada. Primeiro commit ganha - a primeira modificao feita persistente, e o usurio que envia a segunda recebe uma mensagem de erro. Optimistic locking. Mesclar updates conflitantes - A primeira modificao persistida, e a segunda pode ser aplicada seletivamente pelo usurio. importante que o usurio pelo menos saiba do erro Acontece por default.
Hibernate ajuda a implementar as outras duas estratgias usando controle de verses e travas otimistas.
Timestamp
Mapeamento
<class name="Comment" table="COMMENTS"> <id ...../> <timestamp name="lastUpdated" column="LAST_UPDATED"/> ... </class>
Em tese, um timestamp menos seguro pois duas transaes concorrentes poderiam tentar load e update no mesmo milisegundo.
Travas otimistas
Esses recursos permitem o eficiente gerenciamento de colises que implementam a estratgia de trava otimista. StaleObjectStateException lanado em caso de inconsistncia
Enfoque pessimista assume que sero constantes os conflitos e o ideal bloquear completamente o acesso. No ultrapassa os limites de uma sesso Enfoque otimista assume que conflitos sero raros e quando eles acontecerem, possvel lidar com eles. Garante maior escalabilidade e suporta transaes longas.
Session-per-request
Session-per-request-withdetached-objects
Objetos so modificados entre duas sesses Uma transao por sesso Objetos desligados
Session-per-applicationtransaction
Cache
Fica entre sua aplicao e o banco de dados. A aplicao faz uma pesquisa por chave primria ou A camada de persistncia resolve uma associao usando estratgia lazy Escopo de transao - cada unidade de trabalho tem seu prprio cache; vale enquanto a transao est rodando. Escopo de processo - o cache compartilhado entre transaes (h implicaes quanto ao isolamento) Escopo de cluster - compartilhado entre processos na mesma mquina ou entre mltiplas mquinas de um cluster.
Cache no Hibernate
Dois nveis
Primeiro nvel tem escopo de transao. Segundo nvel opcional e tem nvel de processo ou cluster. Uma session ou tem a durao de uma transao de banco de dados ou de uma transao de aplicao longa. No pode ser desligada. Garante identidade do objeto dentro da transao.
Automtico (Session) Usado sempre que se passa um objeto para save(), update(), saveOrUpdate() ou quando ele requisitado com load(), find(),
list(), iterate(), ou filter()
Garante que quando uma aplicao requisita o mesmo objeto persistente duas vezes numa sesso, ela recebe de volta a mesma instncia. Instncias persistentes so desmontadas ( como serializao, mas o algoritmo mais rpido). Requer conhecimento sobre os dados para uso eficiente (no automtico as classes so mapeadas ao cache uma por uma) Se dados so mais freqentemente atualizados que lidos, no habilite o cache de segundo nvel Requer configurao fina em gerente de cache para melhor performance
<version>
Usado em implementao de transaes longas, para sinalizar que uma tabela/objeto est sendo alterada Usado para definir poltica de cache de segundo nvel
<cache>
hibernate.cache.provider_class=nome.da.Classe Usa um cache provider prprio em substituio ao nativo usado pelo Hibernate (implementao de org.hibernate.cache.CacheProvider) hibernate.transaction.factory_class=nome.da.Classe Para definir um gerente de transaes prprio, ou org.hibernate.transaction.<nome> para usar uma
Boas Prticas
Usar sempre o padro facade ...mas como englobar vrias operaes a a vrios DAOs em uma transao?
Suporte transacional
//.. private static Transaction transaction;
Usando
Exerccio
Criar criar DAOs e fachada para a aplicao Criar methodos de negcio para
Transaes e concorrncia
Jobson Ronan {jrjs@cin.ufpe.br}