Primeiro de tudo, o gerenciamento de transações deve ser feito na camada de serviço, e não na camada DAO, pois isso criaria muita sobrecarga de desempenho (para lidar com o nível de isolamento de transação apropriado e a propagação em cada método diferente). Além disso, o escopo de uma unidade de trabalho vem da camada de serviço, e não da camada de acesso a dados: imagine executar um processo de negócios que precise lidar com 2 ou mais DAOs.
Há muita discussão na Internet que aponta nessa direção, como aqui , aqui e aqui .
De qualquer forma, já que é uma entrevista, vamos aceitar a pergunta como ela é. Do meu ponto de vista, você usaria a @Transactional
anotação (ou a configuração XML) nos dois métodos e com uma propagação de transação com REQUIRED
valor. Dessa forma, quando qualquer um desses métodos for chamado e se nenhuma transação anterior existir, uma nova transação será criada:
@Transactional
class MyDAO {
@Transactional(propagation = REQUIRED)
public void foo() {
}
@Transactional(propagation = REQUIRED)
public void bar() {
}
}
foo()
ebar()
compartilha a mesma transação e, se 1 falhar, outro 1 também reverterá? Você pode fornecer algum esclarecimento?@Transactional(propagation = REQUIRED)
método da camada DAO para propagação e@Transactional
camada de serviço, mas se eu colocar@Transactional
apenas a camada de serviço em vez de colocar a camada DAO, qual é a diferença?propagation = REQUIRED
é o valor padrão para a propagação da anotação transacional; portanto, não é necessário gravá-lo.Ignorando primavera e estruturas na minha resposta ..... apenas a idéia básica de usar parâmetros de função. Tenho certeza de que o conceito pode ser aplicado dentro de [inserir estrutura aqui].
Você precisaria manipular a confirmação / reversão fora dos 2 métodos DAO. Os 2 métodos precisariam tomar a transação / conexão como entrada.
código psuedo:
fonte
Tran t
como parâmetro com os dois métodos. Você pode fornecer alguma explicação?Há uma chance de que dois métodos funcionem independentemente também ao mesmo tempo em que possam ser executados em uma mesma transação. Portanto, precisamos usar Propagation-Required. Se a transação precisar ser executada na mesma transação, ela usará a primeira transação, caso contrário, uma nova transação será criada se invocada de forma independente. Corrija-me se eu estiver errada.
fonte