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?

Foi útil?

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top