SpringBoot (dieciocho) transacciones

Tabla de contenido

transacción de primavera

1. Introducción a los asuntos de primavera

1. Nivel de aislamiento de transacciones

2. Comportamiento de propagación de transacciones

3. Atributos de transacciones declarativas

4. Reglas de reversión de transacciones

5. Precauciones para usar @Transactional

2. Implementación de codificación


transacción de primavera

1. Introducción a los asuntos de primavera

Las transacciones Spring no solo pueden usar la anotación de transacción @Transactional, sino que también admiten el uso programático de transacciones, pero este modo no se usa comúnmente. Las transacciones de Spring se describen en detalle aquí.

1. Nivel de aislamiento de transacciones

De hecho, solo se usa una anotación @Transactional para usar transacciones, que son las transacciones de anotación de Spring. El nivel de aislamiento de transacciones se refiere al grado de aislamiento cuando varias transacciones son concurrentes. Spring declara que las transacciones pueden establecer el nivel de aislamiento de transacciones de Spring a través del atributo de aislamiento. Que proporciona los siguientes cinco niveles de aislamiento de transacciones. @Transactional(isolation=IsolationDEFAULT): el nivel de aislamiento de transacciones predeterminado, es decir, el nivel de aislamiento de transacciones de la base de datos.

La base de datos tiene los siguientes cuatro niveles de aislamiento:

1. Lectura no confirmada En este nivel, cuando una transacción está modificando una fila de datos, no se permite que otra transacción modifique la fila de datos, pero se permite que otra transacción lea la fila de datos. Por lo tanto, en este nivel, no habrá pérdida de actualización, pero se producirán lecturas sucias y lecturas no repetibles.

2. Lectura confirmada En este nivel, las transacciones de escritura no confirmadas no permiten que otras transacciones accedan a la fila, por lo que no se producirán lecturas sucias, pero las transacciones que leen datos permiten que otras transacciones accedan a los datos de la fila, por lo que se dará el caso de no -lectura repetible.

3. Lectura repetible En este nivel, las transacciones de lectura prohíben las transacciones de escritura, pero permiten las transacciones de lectura, por lo que no habrá ninguna situación en la que la misma transacción lea datos diferentes dos veces (lectura no repetible) y las transacciones de escritura prohíban todo lo demás.

4. Serializable Este nivel de serialización requiere que todas las transacciones se ejecuten en serie, por lo que puede evitar todos los problemas causados ​​por la concurrencia, pero la eficiencia es muy baja.

Cuanto mayor sea el nivel de aislamiento de arriba a abajo, mejor se puede garantizar la integridad y coherencia de los datos, pero cuanto mayor sea el impacto en el rendimiento de la concurrencia, menor será la seguridad. Cuanto menor sea el nivel de aislamiento, mayor será la seguridad . Para la mayoría de las aplicaciones, es preferible establecer el nivel de aislamiento del sistema de base de datos en ReadCommitted. Puede evitar lecturas sucias y tiene un mejor rendimiento de concurrencia. Aunque puede causar problemas de simultaneidad, como lecturas no repetibles, lecturas fantasma y actualizaciones perdidas de segundo tipo, en ocasiones individuales en las que pueden ocurrir tales problemas, la aplicación puede usar bloqueo pesimista u optimista para controlarlos.

2. Comportamiento de propagación de transacciones

El comportamiento de propagación de transacciones se refiere al comportamiento que Spring manejará estas transacciones si existen múltiples transacciones al mismo tiempo. El comportamiento de propagación de transacciones se divide en los siguientes tipos.

Se puede ver que 1, 2 y 3 forman un grupo, todos los cuales muestran soporte para la transacción actual. Lo más importante es el método de procesamiento de transacciones actual. Luego 7 solos en un grupo.

Por ejemplo, si hay un método A en un servicio, se llama al método B y el comportamiento de propagación del método B es PROPAGATION_REQUIRED, entonces si el comportamiento de propagación del método A también es PROPAGATION_REQUIRED, cuando se ejecuta el método A, se inicia una transacción, el método A Cuando el método B se ejecuta en el medio, sabe que ya hay una transacción, el método B no creará una nueva transacción y se incluirá directamente en la transacción del método A.

1. PROPAGACIÓN REQUERIDA: si hay una transacción actual, únase a la transacción, si no hay una transacción actual, cree una nueva transacción, que es el comportamiento de propagación de transacción predeterminado de Spring. 2. REQUISITOS DE PROPAGACIÓN NUEVO: Crear una nueva transacción, si hay una transacción actual, suspender la transacción actual. La nueva transacción no tiene nada que ver con la transacción suspendida, son dos transacciones independientes. Cuando falla la reversión de la transacción externa, el resultado de la ejecución de la transacción interna no se puede revertir, y las transacciones internas y externas no pueden interferir entre sí. 3. SOPORTES DE PROPAGACIÓN: si hay una transacción actualmente, únase a la transacción; si no hay transacción, continúe ejecutándose de manera no transaccional. 4. PROPAGACIÓN NO COMPATIBLE: Ejecutar en un modo no transaccional. Si hay una transacción actual, suspender la transacción actual. 5. PROPAGACIÓN NUNCA: se ejecuta en un modo no transaccional. Si hay una transacción actual, se lanzará una excepción. 6. PROPAGACIÓN OBLIGATORIA: Si hay una transacción actual, se une a la transacción, si no hay una transacción actual, lanza una excepción. 7. PROPAGATIONNESTED: Si hay una transacción actual, 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 PROPAGATIONREQUIRED

3. Atributos de transacciones declarativas

Las transacciones de Spring no solo tienen un nivel de aislamiento de transacciones y un comportamiento de propagación de transacciones, sino que también contienen muchos atributos para que los utilicen los desarrolladores, que se describen a continuación.

ovalue: almacena el valor de tipo String, que se utiliza principalmente para especificar diferentes administradores de transacciones, satisfaciendo que hay diferentes administradores de transacciones en el mismo sistema. Por ejemplo, se declaran múltiples administradores de transacciones en el contenedor de Spring, y luego los desarrolladores pueden especificar el administrador de transacciones que se usará de acuerdo con la configuración. Por lo general, en un escenario donde un sistema necesita acceder a múltiples bases de datos, se configuran múltiples administradores de transacciones y luego se toman diferentes decisiones.

TransactionManager: similar al valor, también se usa para seleccionar un administrador de transacciones. propagación: comportamiento de propagación de transacciones, el valor predeterminado es PropagationREQUIRED. aislamiento: el nivel de aislamiento de la transacción, el valor predeterminado es IsolationDEFAULT tiempo de espera: el período de tiempo de espera de la transacción, el valor predeterminado es -1, si la ejecución no se completa después del tiempo establecido, la transacción actual se revertirá automáticamente. readOnly: si la transacción actual es una transacción de solo lectura, el valor predeterminado es falso. Por lo general, puede establecer el valor del atributo de la transacción que lee los datos en verdadero. rollbackFor: puede establecer la excepción especificada que desencadena la transacción, lo que permite especificar varios tipos de excepciones. noRollbackFor: al contrario de rollbackFor, puede establecer excepciones específicas que no desencadenan transacciones, lo que permite especificar varios tipos de excepciones.

4. Reglas de reversión de transacciones

La reversión de transacciones de Spring generalmente ocurre cuando se lanza una excepción basada en la transacción actual, el administrador de transacciones de Spring detecta la excepción no controlada y luego decide si la transacción actual se revierte de acuerdo con las reglas. Si la excepción detectada resulta ser una excepción que establece el atributo notRollbackFor, no se detectará. En la configuración predeterminada, Spring solo retrocederá cuando detecte una subclase de RuntimeException (RuntimeException).

5. Precauciones para usar @Transactional

Al usar la anotación @Transactional, debe prestar atención a algunas situaciones:

@Transactional debe usarse sobre la clase, no sobre la interfaz. Si se usa en la interfaz, la transacción no será válida. @Transactional solo se puede usar en métodos modificados públicos. Si se usa en métodos modificados privados o protegidos, la transacción no será válida. @Transactional Trate de no usarlo sobre la clase, porque usará transacciones para todos los métodos en la clase.Si usa transacciones para métodos de consulta, puede afectar la eficiencia.

2. Implementación de codificación

interfaz del mapeador

@Mapper //该注解就可以不用在配置类中扫描mapper接口包了
public interface UserMapper{
​
    void insertUser1();
​
    void insertUser2();
​
}

archivo de mapeo del asignador

<mapper namespace="com.yka.mapper.UserMapper">
    <insert id="insertUser1">
        insert into t_user(name)value ('杨凯奥1')
    </insert>
​
    <insert id="insertUser2">
        insert into t_user(name)value ('杨凯奥2')
    </insert>
</mapper>

capa de servicio

public interface UserService {
    void insertUser1();
​
    void insertUser2();
}
@Service
public class UserServiceImpl implements UserService {
​
    @Autowired
    private UserMapper userManager;
​
    @Override
    public void insertUser1() {
        userManager.insertUser1();
    }
​
    @Override
    public void insertUser2() {
        userManager.insertUser2();
    }
​
​
}

controlador

@Controller
public class TransactionalController {
​
    @Autowired
    private UserService userService;
​
    @RequestMapping("/Transactional")
    @Transactional//添加事务注解
    public void test(){
        userService.insertUser1();
        System.out.println(1/0);//除0异常
        userService.insertUser2();
    }
​
}

Después de la ejecución, hubo una excepción de división por 0, por lo que se revirtió y las dos declaraciones SQL no se agregaron a la base de datos.

Si no agrega la transacción, sql1 se puede agregar con éxito, pero sql2 no se puede agregar con éxito

Supongo que te gusta

Origin blog.csdn.net/m0_65992672/article/details/130451288
Recomendado
Clasificación