true transaction transacciones requires_new example ejemplo java mysql spring hibernate transactions

java - transaction - transacciones en spring boot



¿Cómo funciona la suspensión de transacciones en Spring? (1)

El objetivo de suspender una transacción es cambiar la transacción actual de una cadena por una nueva. Esto NO se alinearía con la semántica de las transacciones anidadas porque las transacciones nuevas y suspendidas son completamente independientes entre sí. No existe una API de nivel de conexión para admitir la suspensión de transacciones, por lo que esto debe hacerse utilizando una conexión diferente. Si está utilizando JTA con Spring, esto lo hace el administrador de transacciones de JTA. Si está utilizando DataSourceTransactionManager, puede buscar en el código y ver que guardará la conexión actual como un "recurso suspendido" y tomará una nueva conexión de la fuente de datos para la nueva transacción.

Mi pregunta es básicamente la misma que aquí , pero no estoy satisfecho con la respuesta, así que estoy escribiendo esta pregunta.

En el manual de Spring Framework, se establece que, por PROPAGATION_REQUIRES_NEW, se suspenderá la transacción actual. ¿Cómo se implementa esto realmente? Sé que la mayoría de las bases de datos no admiten transacciones anidadas y pueden tener solo una transacción ejecutándose en una conexión. Esto significa que no puede simplemente "no usar" la transacción original y comenzar una nueva: antes de comenzar una nueva debe comprometer o deshacer la transacción original.

Ejemplo:

START TRANSACTION SELECT ... UPDATE ... -- Now we run method with PROPAGATION_REQUIRES_NEW -- How do we "suspend" transaction so we can start new one? START TRANSACTION UPDATE ... COMMIT -- We returned from the method, result was commited -- Now we''d like to "unsuspend" the original transaction so it can be commited/rollbacked, but how?

¿O posiblemente se implemente utilizando otra conexión (objeto Session)? ¿De modo que dejamos de usar la conexión original y creamos una nueva donde podemos comenzar una nueva transacción?

Me falta algo tan obvio que a nadie le importa explicarlo (al menos no en Spring docs, Spring in Action, Spring persistence with Hibernate).

¡Muchas gracias!