Spring transacción independiente y transacción anidada

Tipos de propagación de transacciones en Spring:

  • PROPAGATION_REQUIRED: admite la transacción actual. Si no hay ninguna transacción actualmente, crea una nueva. (defecto)
  • PROPAGATION_SUPPORTS: admite la transacción actual, si no hay ninguna transacción actualmente, se ejecuta de una manera no transaccional.
  • PROPAGATION_MANDATORY: admite la transacción actual, si no hay una transacción actual, lanza una excepción.
  • PROPAGATION_REQUIRES_NEW: crea una nueva transacción. Si hay una transacción actualmente, suspenda la transacción actual.
  • PROPAGATION_NOT_SUPPORTED: la operación se realiza de manera no transaccional. Si hay una transacción actualmente, la transacción actual se suspende.
  • PROPAGATION_NEVER: ejecutar de manera no transaccional, si actualmente hay una transacción, se lanzará una excepción.
  • PROPAGATION_NESTED: si una transacción existe actualmente, se ejecutará dentro de una transacción anidada. Si no hay ninguna transacción actualmente, proceda de manera similar a PROPAGATION_REQUIRED.

 

La diferencia entre PROPAGATION_NESTEDPROPAGATION_REQUIRES_NEW  :

Cuando se usa PROPAGATION_REQUIRES_NEW, la transacción interna y la transacción externa son como dos transacciones independientes. Una vez que se confirma la transacción interna, la transacción externa no puede revertirla. Las dos transacciones no se afectan entre sí. Dos transacciones no son una verdadera transacción anidada. Al mismo tiempo, necesita el apoyo del administrador de transacciones de JTA. Inicie una nueva transacción "interna" que no dependa del entorno. Esta transacción se confirmará por completo o se revertirá sin depender de transacciones externas. Tiene su propio alcance de aislamiento, sus propios bloqueos, etc. Cuando la transacción interna comienza a ejecutarse Cuando se suspende la transacción externa, la transacción externa continuará ejecutándose cuando finalice la transacción interna.

Cuando se usa PROPAGATION_NESTED, la reversión de la transacción externa puede provocar la reversión de la transacción interna. La excepción de la transacción interna no provoca la reversión de la transacción externa, es una verdadera transacción anidada. Cuando DataSourceTransactionManager usa savepoint para admitir PROPAGATION_NESTED, requiere un controlador JDBC 3.0 o superior y compatibilidad con la versión 1.4 o superior de JDK. Otras implementaciones de JTA TrasactionManager pueden tener diferentes métodos de soporte. PROPAGATION_NESTED inicia una transacción "anidada", que es una subtransacción real de una transacción existente. Cuando la transacción latente comienza a ejecutarse, obtendrá un punto de guardado. Si la transacción anidada falla, retrocederemos a este punto de guardado. La transacción latente es parte de la transacción externa y se confirmará solo después de que finalice la transacción externa.

 

Resumen: la mayor diferencia entre PROPAGATION_REQUIRES_NEW y PROPAGATION_NESTED es que PROPAGATION_REQUIRES_NEW es una transacción completamente nueva, mientras que PROPAGATION_NESTED es una subtransacción de una transacción externa. Si la transacción externa se confirma, la transacción latente también se confirmará. Esta regla también se aplica para revertir.

Supongo que te gusta

Origin blog.csdn.net/qq_36807862/article/details/105995045
Recomendado
Clasificación