Questão nº 58
Questão de Tecnologia da Informação - Programação · FGV DPE-RS 2023 (nº 58)
O controle de transações nos Enterprise Java Beans pode ser efetuado de forma simples, com base na Java Transaction API, por meio de anotações sobre os métodos e controle via contêiner.
Com relação ao escopo da transação, especificado pela anotação TransactionAttribute, é correto afirmar que o tipo:
- ANever desconsidera qualquer transação corrente, executando fora de transações, de forma independente;
- BMandatory inicia uma nova transação para execução do método;
- CNotSupported não permite o uso de transações, gerando uma exceção caso haja uma transação em andamento;
- DRequiredNew exige uma transação corrente, gerando uma exceção caso não haja uma transação em andamento;
- ESupports utiliza uma transação do cliente, caso exista, mas não cria transações para a execução do método. (alternativa correta)
Resposta comentada
Gabarito Alternativa E
No desenvolvimento de sistemas com Enterprise Java Beans (EJB), o controle de transações define como as operações de um método (como salvar dados no banco) são agrupadas para garantir que tudo aconteça ou nada aconteça (princípio ACID). A anotação `@TransactionAttribute` é usada para dizer ao contêiner EJB como ele deve gerenciar a transação para um método específico.
(A) Incorreta: O tipo `Never` não desconsidera simplesmente uma transação corrente. Ele exige que não haja uma transação em andamento. Se houver uma transação ativa ao chamar o método, ele lançará uma exceção, indicando que a operação não pode ser executada dentro de uma transação.
(B) Incorreta: O tipo `Mandatory` não inicia uma nova transação. Ele exige que uma transação já esteja em andamento. Se o método for chamado sem uma transação ativa, o contêiner lançará uma `TransactionRequiredException`. A armadilha aqui é confundir "exigir" com "iniciar", o que é um erro comum, pois outros tipos como `Required` ou `RequiresNew` podem iniciar transações.
(C) Incorreta: O tipo `NotSupported` realmente não permite o uso de transações para o método, mas ele não gera uma exceção caso haja uma transação em andamento. Em vez disso, se uma transação estiver ativa, ela é suspensa antes da execução do método e retomada após o método terminar.
(D) Incorreta: O tipo `RequiredNew` não exige uma transação corrente para funcionar, nem gera exceção se não houver. Ele sempre inicia uma nova transação para o método, suspendendo qualquer transação existente se houver. A descrição da alternativa se encaixa no comportamento do tipo `Mandatory`.
(E) Correta: O tipo `Supports` faz exatamente isso: se uma transação já estiver ativa (do "cliente" que chamou o método), o método é executado dentro dessa transação. Se não houver uma transação ativa, o método é executado sem transação. Ele nunca inicia uma nova transação por conta própria.
Fonte: FGV DPE-RS 2023 Técnico - Apoio Especializado (Programador) (Caderno Tipo 1). Reproduzida para fins de estudo.