En el escenario de transacción @Transactional, después de que se lanza y detecta la excepción, si necesita revertir, debe revertir la transacción manualmente.

En un escenario de transacción, después de que se lanza y detecta una excepción, si se requiere una reversión, la transacción se debe revertir manualmente.


@Override
        @Transactional
        public void save(User user) {
    
    
            DefaultTransactionDefinition def = new DefaultTransactionDefinition();
            // explicitly setting the transaction name is something that can only be done programmatically
            def.setName("SomeTxName");
            def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
 
            TransactionStatus status = transactionManager.getTransaction(def);
            try {
    
    
                // execute your business logic here
                //db operation
            } catch (Exception ex) {
    
    
                //手动回滚事务
                TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
                throw ex;
            }
        }

De forma predeterminada, el marco de transacciones Spring solo revierte la transacción cuando se lanzan RuntimeException y excepciones no verificadas (errores predeterminados: reversión de transacción), pero la transacción no se revierte cuando se lanzan excepciones marcadas.

Si queremos cambiar este valor predeterminado, podemos configurarlo según la escena:

También revertir transacciones cuando se lanzan excepciones marcadas: @Transactional(rollbackFor=Exception.class)
No revertir transacciones cuando se lanzan excepciones no marcadas: @Transactional(notRollbackFor=RunTimeException.class)
No se requiere administración de transacciones: @Transactional(propagation=Propagation. NOT_SUPPORTED)
Nota: Si la excepción es detectada por try{}catch{}, la transacción no se revertirá. Si desea que la transacción se revierta, debe lanzar try{}catch{throw Exception}.

La sugerencia del equipo de Spring es que utilice la anotación @Transactional en una clase concreta (o método de clase), no en ninguna interfaz que implemente la clase. Por supuesto, puede utilizar la anotación @Transactional en las interfaces, pero esto sólo funcionará si configura un proxy basado en interfaz. Debido a que las anotaciones no se heredan, esto significa que si utiliza proxies basados ​​en clases, los proxies basados ​​en clases no reconocerán la configuración de las transacciones y los proxies de transacciones no empaquetarán los objetos (se validarán como serios). Por lo tanto, siga el consejo del equipo de Spring y utilice la anotación @Transactional en clases concretas.
La anotación @Transactional identifica el método y el proceso de procesamiento es lo más simple posible. Especialmente para los métodos de transacción con bloqueos, es mejor no incluirlos en la transacción si no se pueden colocar en la transacción. Se pueden realizar operaciones regulares de consulta de base de datos antes de la transacción, y operaciones como agregar, eliminar, modificar y bloquear consultas se pueden realizar dentro de la transacción.

Supongo que te gusta

Origin blog.csdn.net/god_sword_/article/details/129291879
Recomendado
Clasificación