Antes de falar sobre gerenciamento de transações de primavera, vamos pensar em como executamos operações de dados em Hibernate quando não usamos a primavera. No Hibernate, devemos primeiro iniciar a transação, depois executar operações de dados, depois enviar a transação e fechar a transação. A razão pela qual fazemos isso é porque a transação padrão da Hibernate Commit é falsa, o que exige que enviemos manualmente a transação. Se você não deseja enviar manualmente a transação sempre, poderá configurá -la para confirmar automaticamente a transação no meu arquivo hibernate.cfg.xml:
Código XML
<propriedade name = "DefaultAutocomit"> <Value> false </value> </propriedade>
Embora definirmos seu método de comprometimento da transação para automático, ele pode executar operações de dados, isso não atende às nossas necessidades comerciais reais, porque às vezes depois de economizar um dados, espero que possam continuar a salvar outros dados. Espero cometer a transação juntos depois de salvar dois ou mais dados. Dessa forma, mesmo que haja um erro, podemos reverter e garantir a consistência dos dados. Sucesso ou fracasso. No momento, não podemos comprometer automaticamente a transação após salvar um dados, porque eles não estão na mesma transação e não podemos garantir a consistência dos dados. Portanto, neste momento, precisamos configurar manualmente nossas transações, o que requer o uso do mecanismo de gerenciamento de transações fornecido pelo Spring for Hibernate. O gerenciamento de transações fornecido pela primavera pode ser dividido em duas categorias: programático e declarativo. A programação é realmente controlada no código. Assim como o Hibernate opera dados, ele inicia transações e envia transações. Esse método possui certas limitações; portanto, geralmente usamos o declarativo para configurar nossas transações.
A configuração da transação declarativa é dividida principalmente nas etapas a seguir:
1. Configuração da transação declarativa
(1) configurar o gerente de transação;
(2) as características de propagação da transação;
(3) Essas classes e métodos usam transações.
<!-Configure a fábrica de sessão que o gerenciador de transações especifica sua função e entrega a transação à mola para processamento-> <bean id = "transactionManager"> <propriedade name = "sessionFactory"> <ref bean = "sessionFactory"/> </Property> </ Bean> <!-Configure a característica de propagação de transações-> transação-manager = "transactionManager"> <tx: atributes> <tx: método name = "save*" propagation = "requerir"/> <tx: método name = "delete*" propagação = "requerir"/> <tx: namesny "update*" propagation = ""/> <Tx: names) <tx: método name = "*" readly = "true"/> </tx: atributos> </tx: conselhos> <!-Quais métodos dessas classes participam de transações-> <DaOP: config> <aOP: Pointcut id = "AllServicemethod" Expression = "Execution (*com.coe.Service. Pointcut-ref = "AllServicemethod" conselhos-ref = "txadvice"/> </aop: config>
Ao configurar transações, geralmente definimos o limite de transação para a camada de serviço, ou seja, sua camada de lógica de negócios, porque geralmente concluímos algumas de nossas colunas de operações de dados em nossa camada lógica de negócios. Se colocado na camada de dados DAO, a granularidade é muito pequena. Além disso, se configurarmos transações na camada lógica de negócios, também será benéfico para o nosso cache secundário, que você encontrará no futuro quando realmente o operar.
2. Escreva métodos de lógica de negócios
No momento, podemos usar os métodos de operação de dados fornecidos no HibernateTemplate para escrever nossos métodos de lógica de negócios em nossa camada lógica de negócios. Obviamente, nosso método deve ser o mesmo que configurado em nossa configuração de transação, usando salvar, excluir, atualizar e obter como o começo de nosso método. Deve -se notar que, por padrão, a exceção de tempo de execução só recuará (incluindo a herdeira da subclasse de RuntimeException) e exceções ordinárias não rolarão.
Por fim, vamos resumir as várias características de propagação das transações:
1. Propagation_Required: Se existir uma transação, a transação atual será suportada. Se não houver transação, ele será ativado;
2. Propagation_supports: Se existir uma transação, a transação atual será suportada. Se não houver transação, a execução de não transações;
3. Propagation_mandatory: Se já existir uma transação, a transação atual será suportada. Se não houver transação ativa, uma exceção será lançada;
4. Propagation_Requires_New: Sempre abra uma nova transação. Se já existe uma transação, a transação existente será suspensa;
5. propagation_not_supported: sempre execute não transactacional e suspenda qualquer transação existente;
6. propagation_never: Sempre executado não transacional, se existir uma transação ativa, uma exceção será lançada;
7. Propagation_nested: Se existir uma transação ativa, ela será executada em uma transação aninhada. Se não houver transação ativa, execute -o de acordo com a propriedade transactionDefinition.propagation_required.
Através deste artigo, espero que possa ajudá -lo a entender o gerenciamento integrado de transações da primavera e Hibernate. Obrigado pelo seu apoio a este site!