Anotación de transacción SpringBoot @Transactional

SpringBoot proporciona operaciones de transacción muy convenientes. Puede implementar la reversión de transacciones a través de anotaciones, lo cual es muy conveniente y rápido. Hablemos sobre cómo realizar las operaciones de transacción.

1. Descripción de la empresa

En Spring, hay dos formas de implementar transacciones, que son la gestión programática de transacciones y la gestión declarativa de transacciones. 
Gestión de transacciones mediante programación: la gestión de transacciones mediante programación utiliza TransactionTemplate o utiliza directamente el PlatformTransactionManager subyacente. Para la gestión de transacciones programáticas, Spring recomienda utilizar TransactionTemplate. 
Gestión declarativa de transacciones: construida sobre AOP. Su esencia es interceptar antes y después del método, y luego crear o agregar una transacción antes de que comience el método de destino, y enviar o revertir la transacción de acuerdo con la ejecución después de que se ejecute el método de destino. 
La gestión declarativa de transacciones no requiere código de intrusión y las operaciones de transacción se pueden realizar a través de @Transactional, que es más rápido y sencillo. Uso recomendado

2. Cómo usar

Usar transacciones en Mybatis es muy simple, solo necesitas agregar la anotación @Transactional a la función sin ninguna configuración. Echemos un vistazo al ejemplo de agregar transacciones en la capa del controlador:

@Autowired
OrderServiceorderService;   //order操作的Service层

@ApiOperation(value = "增加OrderCustomer")
@RequestMapping(value = "", method = RequestMethod.POST)
@ResponseBody
@Transactional
public JsonBean<Order> insertOrder(@RequestParam(value = "order") String order) {
    try {
        //创建订单
        Order order = orderService.insert(user.getId(),is_company,fk_want_company_id);
        return new JsonBean(SUCCESS, orderCustomer);
    } 
    catch (ErrorCodeException e)
    {
        TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
        return new JsonBean(e.getErrorCode());
    }
}
wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw ==


@Transactional puede actuar sobre interfaces, métodos de interfaz, clases y métodos de clase. Cuando se usa como una clase, todos los métodos públicos de la clase tendrán el atributo de transacción de este tipo. Al mismo tiempo, también podemos usar esta anotación a nivel de método para anular la definición de nivel de clase. Por lo tanto, se puede usar en la capa de Servicio y la capa de Controlador. El ejemplo anterior se implementa en la capa de Controlador. Simulamos una interfaz de envío de pedidos, donde JsonBean es la clase base para la devolución uniforme de códigos de error y ErrorCodeException es una excepción.

A través de @Transactional se realizan operaciones transaccionales.
El AOP de Spring, la gestión declarativa de transacciones, tiene como valor predeterminado la reversión para excepciones no comprobadas. Es decir, de forma predeterminada, la excepción RuntimeException () o sus subclases se revierten; la excepción marcada, es decir, la excepción se puede detectar mediante try {} y no se revertirá. Por lo tanto, para nuestra excepción personalizada, establecemos a través de rollbackFor, y se hará por separado más adelante, digamos
si necesitamos capturar la excepción, al mismo tiempo, deshacerlo mediante TransactionAspectSupport.currentTransactionStatus () setRollbackOnly (); reversión manual.
Use Object savePoint = TransactionAspectSupport.currentTransactionStatus (). CreateSavepoint (); para 
establecer el punto de retroceso, use TransactionAspectSupport.currentTransactionStatus (). RollbackToSavepoint (savePoint); para retroceder a savePoint.
3. Configuración común

Nombre del parámetro Descripción de la función
readOnly Este atributo se utiliza para establecer si la transacción actual es una transacción de solo lectura, se establece en verdadero para indicar solo lectura, falso para indicar lectura-escritura y el valor predeterminado es falso. Por ejemplo: @Transactional (readOnly = true)
rollbackFor Este atributo se utiliza para establecer la matriz de clases de excepción que debe revertirse. Cuando se lanza una excepción en la matriz de excepciones especificada en el método, la transacción se revierte. Por ejemplo: especifique una sola clase de excepción: @Transactional (rollbackFor = RuntimeException.class) especifique varias clases de excepción: @Transactional (rollbackFor = {RuntimeException.class, Exception.class})
rollbackForClassName Este atributo se utiliza para establecer la clase de excepción que necesita para ser revertido La matriz de nombre, cuando la excepción en la matriz de nombre de excepción especificada se lanza en el método, la transacción se revierte. Por ejemplo: especifique un solo nombre de clase de excepción @Transactional (rollbackForClassName = ”RuntimeException”) especifique varios nombres de clase de excepción: @Transactional (rollbackForClassName = {"RuntimeException", "Exception"})
noRollbackFor Este atributo se usa para establecer la reversión no requerida Matriz de clase de excepción, cuando la excepción en la matriz de excepción especificada se lanza en el método, la transacción no se revertirá. Por ejemplo: especifique una única clase de excepción: @Transactional (noRollbackFor = RuntimeException.class) Especifique varias clases de excepción: @Transactional (noRollbackFor = {RuntimeException.class, Exception.class})
noRollbackForClassName Este atributo se usa para establecer la matriz de nombres de clases de excepción que no necesitan revertirse.Cuando se lanza una excepción en la matriz de nombres de excepción especificada en el método, la transacción no se revertirá. Por ejemplo: especifique un solo nombre de clase de excepción: @Transactional (noRollbackForClassName = "RuntimeException") especifique varios nombres de clase de excepción: @Transactional (noRollbackForClassName = {"RuntimeException", "Exception"})
propagación Este atributo se utiliza para establecer el comportamiento de propagación de la transacción. Por ejemplo: @Transactional (propagation = Propagation.NOT_SUPPORTED, readOnly = true)
aislamiento Esta propiedad se usa para establecer el nivel de aislamiento de la transacción de la base de datos subyacente. El nivel de aislamiento de la transacción se usa para manejar el caso de múltiples transacciones al mismo tiempo. Por lo general, el Se puede usar el nivel de aislamiento predeterminado de la base de datos. Básicamente no es necesario establecer el
tiempo de espera Este atributo se usa para configurar los segundos de tiempo de espera de la transacción, el valor predeterminado es -1, lo que significa que nunca se agota el tiempo de espera
4. Atributos de la transacción

Nivel de
aislamiento de transacciones El nivel de  aislamiento se refiere al grado de aislamiento entre varias transacciones simultáneas. En la interfaz TransactionDefinition se definen cinco constantes que representan el nivel de aislamiento:

TransactionDefinition.ISOLATION_DEFAULT: este es el valor predeterminado, lo que significa que se utiliza el nivel de aislamiento predeterminado de la base de datos subyacente. Para la mayoría de las bases de datos, este valor suele ser TransactionDefinition.ISOLATION_READ_COMMITTED. 
TransactionDefinition.ISOLATION_READ_UNCOMMITTED: este nivel de aislamiento significa que una transacción puede leer datos modificados por otra transacción, pero aún no se ha comprometido. Este nivel no puede evitar lecturas sucias, lecturas no repetibles y lecturas fantasma, por lo que este nivel de aislamiento rara vez se usa. Por ejemplo, PostgreSQL en realidad no tiene este nivel. 
TransactionDefinition.ISOLATION_READ_COMMITTED: este nivel de aislamiento significa que una transacción solo puede leer datos que han sido confirmados por otra transacción. Este nivel puede evitar lecturas sucias, que también es el valor recomendado en la mayoría de los casos. 
TransactionDefinition.ISOLATION_REPEATABLE_READ: este nivel de aislamiento significa que una transacción puede ejecutar una consulta varias veces durante todo el proceso, y los registros devueltos cada vez son los mismos. Este nivel puede evitar lecturas sucias y lecturas no repetibles. 
TransactionDefinition.ISOLATION_SERIALIZABLE: Todas las transacciones se ejecutan una a una, por lo que no hay interferencia entre transacciones, es decir, este nivel puede evitar lecturas sucias, lecturas no repetibles y lecturas fantasmas. Pero esto afectará seriamente el desempeño del programa. Normalmente tampoco se utiliza este nivel.

Comportamiento de propagación de transacciones El 
llamado comportamiento de propagación de transacciones significa que si ya existe un contexto de transacción antes de iniciar la transacción actual, existen varias opciones para especificar el comportamiento de ejecución de un método transaccional. Las siguientes constantes que representan el comportamiento de propagación se incluyen en la definición de TransactionDefinition:

TransactionDefinition.PROPAGATION_REQUIRED: Si hay una transacción actualmente, únase a la transacción; si no hay ninguna transacción actualmente, cree una nueva transacción. Es el valor predeterminado. 
TransactionDefinition.PROPAGATION_REQUIRES_NEW: Cree una nueva transacción, si hay una transacción actualmente, luego suspenda la transacción actual. 
TransactionDefinition.PROPAGATION_SUPPORTS: Si actualmente hay una transacción, únase a la transacción; si no hay ninguna transacción actual, continúe ejecutándose de manera no transaccional. 
TransactionDefinition.PROPAGATION_NOT_SUPPORTED: Ejecutar en un modo no transaccional. Si hay una transacción actualmente, la transacción actual se suspende. 
TransactionDefinition.PROPAGATION_NEVER: se ejecuta en un modo no transaccional. Si hay una transacción actualmente, se lanzará una excepción. 
TransactionDefinition.PROPAGATION_MANDATORY: Si hay una transacción actualmente, únase a la transacción; si no hay ninguna transacción actualmente, se lanzará una excepción. 
TransactionDefinition.PROPAGATION_NESTED: si hay una transacción actualmente, cree una transacción para ejecutar como una transacción anidada de la transacción actual; si no hay una transacción actual, el valor es equivalente a TransactionDefinition.PROPAGATION_REQUIRED.

Tiempo de espera de la transacción El 
llamado tiempo de espera de la transacción se refiere al tiempo máximo que se permite ejecutar una transacción. Si se excede el límite de tiempo pero la transacción no se ha completado, la transacción se revierte automáticamente. El valor int se usa para representar el período de tiempo de espera en TransactionDefinition, y la unidad es segundos. 
La configuración predeterminada es el valor de tiempo de espera del sistema de transacciones subyacente. Si el sistema de transacciones de la base de datos subyacente no establece un valor de tiempo de espera, entonces no es ninguno y no hay límite de tiempo de espera.

Propiedad
de transacción de solo lectura La transacción de solo  lectura se usa cuando el código del cliente es de solo lectura pero no modifica los datos. La transacción de solo lectura se usa para la optimización en escenarios específicos, como cuando se usa Hibernate. 
El valor predeterminado es leer y escribir transacciones.
 

Supongo que te gusta

Origin blog.csdn.net/qq_27828675/article/details/89514545
Recomendado
Clasificación