Falha na transação da primavera

0x01: se o banco de dados não suportar transações, ele falhará
porque a transação está agindo no banco de dados. Por exemplo, se você usar o MySQL e o mecanismo for MyISAM, a transação não funcionará porque o próprio mecanismo MyISAM não suporta transações; se você mudar para o InnoDB, poderá.

0x02: A classe Service não é gerenciada pelo Spring.
Como as transações do Spring são baseadas no AOP, se a classe Service não for gerenciada pelo Spring, ela se tornará um Spring Bean. Mesmo se a anotação @Transactional for adicionada, a transação será inválida.

0x03: Chamada interna
O método sem transação chama o método com transação nesta classe e não será revertido. Como a reversão do Spring é gerada usando o modo proxy, se for um método sem uma transação para chamar o método com uma transação dessa classe, ela será chamada diretamente por this.xxx () sem gerar uma transação proxy, para que a transação não funcione . Soluções comuns são "desclassificação".

@Service
public
 
class
 
OrderServiceImpl
 
implements
 
OrderService
 
{

    
public
 
void
 update
(
Order
 order
)
 
{
        updateOrder
(
order
);
    
}

    
@Transactional
    
public
 
void
 updateOrder
(
Order
 order
)
 
{
        
// update order
    
}

}

0x04: use o método de processamento de transações padrão

O padrão da transação Spring é a reversão de RuntimeException e não herda RuntimeException sem reversão. Como no design do java, ele pensa que as exceções que não herdam o RuntimeException são CheckException ou exceções comuns, como IOException, essas exceções precisam ser tratadas na sintaxe Java. Para essas exceções comuns, o Spring usa como padrão as manipulações, portanto o padrão é não reverter. Você pode adicionar rollbackfor = Exception.class para indicar que todas as exceções foram revertidas.

0x05: As transações só podem ser aplicadas a métodos públicos.
As anotações @Transactional podem ser aplicadas apenas a métodos públicos. Se você usar as anotações @Transactional em métodos de visibilidade protegidos, privados ou padrão, isso será ignorado e nenhuma exceção será lançada.

0x06: A fonte de dados não está configurada com um gerenciador de transações


// 其中 dataSource 框架会自动为我们注入
    
@Bean
    
public
 
PlatformTransactionManager
 txManager
(
DataSource
 dataSource
)
 
{
        
return
 
new
 
DataSourceTransactionManager
(
dataSource
);
    
}

Se você deseja usar transações, o gerenciador de transações não está configurado e os outros são em vão.

Publicado 17 artigos originais · Curtidas0 · Visitas 224

Acho que você gosta

Origin blog.csdn.net/weixin_42531204/article/details/104932363
Recomendado
Clasificación