Se eu acesso UserTransaction que isso significa que eu uso 2 fases ou XA?
-
19-09-2019 - |
Pergunta
UserTransaction ut = pesquisa .... ut.beginTransaction (); saveToFooDB (); statelessEjb.transactionSupportedMethod (); // salva algo para o Foo DB saveToFooDB (); ut.commit ();
Se eu estava fazendo a acima, então o meu entendimento é que ele não é uma transação XA, pois não span em vários recursos (como DB além JMS). É meu entendimento correto?
Solução
Fonte de dados pode ser configurado de dois tipos:
- XA : estes fonte de dados podem participar de distribuir transações
- Local : também chamado de não-XA, eles não podem participar de uma transação distribuída
O UserTransaction
é definido na especificação JTA que descrevem como coordenar o participante em uma transação distribuída.
O servidor de aplicação que implementa a especificação JTA é no entanto livre para fazer um monte de otimizações. Um deles é o last-agent-optimization
, que permite que o último participante na transacção distribuída para ser Local . Um regular commit é feito então para os últimos participantes. Se houver apenas um participante, então é sempre o caso.
Em resumo:
- Se você tem mais de um participante, XA e 2 fases necessidade de ser usado
- se houver apenas um participante, a maioria fonte de dados local, suporte de servidor de aplicação e não use a fase full-golpe 2 protocolo de confirmação.
Para Glassfish ver:
Editar
Parágrafo "escopo de transação" da documentação glassfish explica isso melhor do que eu. Eu acho que é o mesmo para todos os servidores de aplicação.
A transação local envolve apenas uma recurso não XA e exige que todos os participando componentes do aplicativo executar dentro de um processo. Local otimização transação é específico para o gerente de recursos e é transparente para o Java EE aplicação.
No Application Server, um JDBC recurso é não-XA se enquadra em qualquer um os seguintes critérios:
Na configuração pool de conexão JDBC, a classe DataSource não implementa a javax.sql.XADataSource interface.
A caixa de Suporte Global Transaction não é marcada, ou o Resource definição do tipo de não existe ou não é conjunto para javax.sql.XADataSource.
A transação permanece local se o seguintes condições permanecer fiel:
- Um e apenas um recurso não-XA é usado. Se alguma não-XA adicional recurso é utilizado, a transação é abortado.
- Nenhuma transação importar ou exportar ocorre.
As operações que envolvem múltiplos recursos ou participante múltipla processos são distribuídos ou global transações. Uma lata transação global envolver um recurso não-XA se passado otimização agente está habilitado. Caso contrário, todos os recursos devem ser XA. O uso da última agente de otimização propriedade é definida como true por padrão. Para obter detalhes sobre como definir esse propriedade, consulte Configurando o Serviço de Transação.
Se apenas um recurso XA é usado em uma transação, consolidação de uma fase ocorre, caso contrário, a transação é coordenada com a confirmação de duas fases protocolo.
Outras dicas
Uma vez que você começar a UserTransaction, e, em seguida, obter uma conexão para o recurso (por exemplo, bases de dados) usando uma conexão de fábrica que é declarado ser xa-solidária, que significa que a ligação se tornará parte da transação XA. Além disso, não importa em tudo se você está se conectando tipos únicas ou múltiplas de recursos como JMS e banco de dados.
Espero que ajude.
Nitin