Local transaction containment
O IBM® WebSphere Application Server suporta retenção de transação local (LTC), que você pode configurar utilizando descritores de implementação estendida de transação local. O suporte LTC fornece certas vantagens aos programadores de aplicativos. Use os cenários fornecidos e a lista de pontos a serem considerados para ajudá-lo a decidir a melhor maneira de configurar o suporte de transação para transações locais.
As seções a seguir descrevem as vantagens fornecidas pelo suporte de LTC e como configurar os descritores de implementação estendida de transação local em cada situação.
- Você pode desenvolver um enterprise bean ou servlet que acesse um ou mais bancos de dados que sejam independentes e não necessitem coordenação.
- Se um enterprise bean não precisar utilizar transações globais, muitas vezes
será mais eficiente implementar o bean com o descritor de implementação do
tipo de transação do contêiner configurado como NotSupported em vez de Required.
Com o suporte estendido a transações locais do servidor de aplicativos, os aplicativos podem desempenhar a mesma lógica de negócios em um contexto de transação não específico que em uma transação global. Um enterprise bean, por exemplo, será executado em um contexto de transação não especificado se for implementado com um tipo de transação de contêiner de NotSupported ou Never.
O suporte a transações locais estendidas fornece um limite de transações locais implícitas, gerenciado pelo contêiner, dentro do qual o contêiner confirma as atualizações do aplicativo e limpa suas conexões. Os aplicativos podem ser projetados com mais independência das questões de implementação. Isto torna muito mais simples utilizar um tipo de transação de contêiner de Supports, por exemplo, quando a lógica de negócios puder ser chamada com ou sem um contexto de transação global.
Um aplicativo pode seguir um padrão obter-utilizar-fechar de uso de conexão, independentemente de ser executado em uma transação. O aplicativo pode depender de a ação de fechamento se comportar da mesma maneira em todas as situações, ou seja, ela não fará com que ocorra uma recuperação na conexão se não houver transação global.
Há muitos cenários em que a coordenação por ACID de vários gerenciadores de recursos não é necessária. Em tais cenários, a execução de uma lógica de negócios em uma política Transaction de NotSupported é melhor executada do que em uma política de Required. Esse benefício é aplicado por meio da configuração do descritor de implementação, na seção Transações Locais do atributo Resolvedor, como ContainerAtBoundary. Com essa configuração, as interações do aplicativo com os provedores de recursos, como bancos de dados, são gerenciadas nas RMLT (Implicit Resource Manager Local Transactions) que o contêiner tanto inicia quanto termina. O contêiner confirma as RMLTs no limite de restrição especificado pelo atributo Limite na seção Transações Locais, por exemplo, no final de um método. Se o aplicativo retornar o controle ao contêiner por uma exceção, o contêiner efetuará o rollback de quaisquer RMLTs que ele tenha iniciado.
Este uso se aplica a servlets e a enterprise beans.
- É possível utilizar as transações locais em um ambiente gerenciado que garanta a limpeza.
- Aplicativos que queiram controlar RMLTs, iniciando-as e finalizando-as explicitamente,
podem utilizar a configuração padrão de Aplicativo para o descritor de implementação estendido
Resolvedor, na seção Transações Locais. Neste caso, o contêiner
assegura a limpeza da conexão no limite do contexto de transação local.
A plataforma Java™ para especificações de aplicativos corporativos que descrevem o uso de transações locais do aplicativo fazem isso na maneira fornecida pelas configurações padrão de Aplicativo para o descritor de implementação estendida Resolvedor, e de Recuperação para o descritor de implementação estendida Ação Não Resolvida, na seção Transações Locais. Quando o descritor de implementação estendido Ação não-resolvida na seção Transações Locais é configurado como Confirmar, o contêiner confirma as RMLTs que o aplicativo inicia, mas que não são concluídas quando a contenção da transação local termina (por exemplo, no encerramento do método). Este uso se aplica a servlets e a enterprise beans.
Você pode estender a duração de uma transação além da duração de um método de componente EJB.
As especificações EJB (Enterprise JavaBeans) restringem o uso de RMLTs a métodos EJB individuais. Esta restrição existe porque as especificações não têm dispositivo de escopo, além de um limite de método imposto pelo contêiner, ao qual uma RMLT possa ser estendida. Você pode utilizar a configuração de implementação estendida Limite na seção Transações Locais para fornecer as seguintes vantagens:
- Estender significativamente os casos de uso de RMLTs.
- Tornar possíveis interações conversacionais com gerenciadores de recursos de uma fase através de suporte a ActivitySession.
É possível utilizar uma ActivitySession para fornecer um contexto distribuído com um limite que é maior que um método único. Você pode estender o uso de RMLTs pelo limite maior de ActivitySession, que pode ser controlado por um cliente. O limite de ActivitySession reduz a necessidade de utilizar transações distribuídas onde operações de ACID em vários recursos não sejam necessárias. Esse benefício é aplicado por meio da configuração de implementação estendida Limite, na seção Transações Locais, de ActivitySession. Essas RMLTs estendidas podem permanecer sob o controle do aplicativo ou ser gerenciadas pelo contêiner, dependendo da configuração do descritor de implementação Resolvedor na seção Transações Locais.
- É possível coordenar vários gerenciadores de recursos de uma fase.
- Para gerenciadores de recursos que não suportam coordenação de transações XA, um cliente pode utilizar contextos de transação local limitados por ActivitySession. Esses contextos dão a um cliente a mesma capacidade de controlar a direção de conclusão das atualizações de recursos pelos gerenciadores de recursos que o cliente tem para gerenciadores de recursos transacionais. Um cliente pode iniciar uma ActivitySession e chamar seus beans de entidade nesse contexto. Esses beans podem executar suas RMLTs dentro do escopo daquela ActivitySession e retornar sem concluir as RMLTs. O cliente pode concluir posteriormente a ActivitySession em uma direção de commit ou rollback e fazer com que o contêiner oriente as RMLTs limitadas pela ActivitySession nessa direção coordenada.
- Você pode utilizar LTCs compartilháveis para reduzir o número de conexões necessárias.
- Os componentes de aplicativo podem compartilhar LTCs. Se os componentes obtiverem conexões com o mesmo gerenciador de recursos, eles poderão compartilhar essa conexão se forem executados na mesma transação globlal ou LTC compartilhável. Para configurar dois componentes para execução no mesmo LTC compartilhável, defina o atributo Compartilhável da seção Transações Locais no descritor de implementação de cada componente. Certifique-se de que a referência de recurso no descritor de implementação de cada componente utilize o valor padrão Compartilhável para o elemento res-sharing-scope, se esse elemento for especificado. Um LTC compartilhável pode reduzir os números de RMLTs que um aplicativo utiliza. Por exemplo, um aplicativo que faz uso frequente do módulo da Web inclui chamadas que podem compartilhar conexões do gerenciador de recursos entre esses módulos da Web, explorando os LTC compartilhados ou uma transação global, reduzindo a contenção de bloqueio dos recursos.
Exemplos de configurações de suporte de transação local
A lista a seguir fornece cenários que utilizam transações locais e pontos a serem considerados ao decidir a melhor maneira de configurar o suporte a transações para um aplicativo.
- Você deseja iniciar e finalizar transações globais explicitamente no aplicativo
(apenas beans de sessão de transação gerenciada por bean e servlets).
Para um bean de sessão, configure o tipo Transação como Bean (para utilizar transações gerenciadas por beans) no descritor de implementação do componente. Não é necessário fazer isso para servlets.
Você quer acessar somente um recurso XA ou não XA em um método.
No descritor de implementação do componente, na seção Transações Locais, configure o atributo Resolvedor como ContainerAtBoundary. Na seção Transações do Contêiner, configure o tipo de transação do contêiner como Supports.
- Você quer acessar vários recursos de XA atomicamente entre um ou mais métodos
de bean.
No descritor de implementação do componente, na seção Transações do Contêiner, configure o tipo de transação do contêiner como Required, RequiresNew ou Mandatory.
Você deseja acessar vários recursos não XA em um método sem precisar gerenciar suas próprias transações locais.
No descritor de implementação do componente, na seção Transações Locais, configure o atributo Resolvedor como ContainerAtBoundary. Na seção Transações do Contêiner, configure o tipo de transação do contêiner como NotSupported.
- Você quer acessar vários recursos não XA em um método e quer gerenciá-los
independentemente.
No descritor de implementação do componente, na seção Transações Locais, configure o atributo Resolvedor como Aplicativo e o atributo Ação não resolvida como Recuperação. Na seção Transações do Contêiner, configure o tipo de transação do contêiner como NotSupported.
Você deseja acessar um ou mais recursos não XA através de várias chamadas de métodos EJB sem precisar gerenciar suas próprias transações locais.
No descritor de implementação do componente, na seção Transações Locais, configure o atributo Resolvedor como ContainerAtBoundary e o atributo Limite como ActivitySession. Na seção Cache do Bean, configure o atributo Ativar em como ActivitySession. Na seção Transações do Contêiner, configure o tipo de transação do contêiner como NotSupported e o atributo de tipo ActivitySession como Required, RequiresNew ou Mandatory.
Você quer acessar vários recursos não XA entre várias chamadas de método EJB e quer gerenciá-los independentemente.
No descritor de implementação do componente, na seção Transações Locais, configure o atributo Resolvedor como Aplicativo e o atributo Limite como ActivitySession. Na seção Cache do Bean, configure o atributo Ativar em como ActivitySession. Na seção Transações do Contêiner, configure o tipo de transação do contêiner como NotSupported e o atributo de tipo ActivitySession como Required, RequiresNew ou Mandatory.
Você deseja utilizar um recurso não XA com vários recursos RRS de duas fases.
Um recurso não XA em uma transação junto com recursos RRS é suportado sempre que uma transação global está ativa. Uma transação global está ativa quando o descritor de implementação do tipo de transação do contêiner está configurado como Supports, Required, RequiresNew ou Mandatory. As transações globais também estão ativas para implementações gerenciadas por componente. O contêiner gerencia a conclusão da transação local de recursos não XA junto com os recursos RRS.