es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Forma elegante de unir transacciones en Reactive Vert.X

Digamos que tengo un método de servicio donde realizo alguna validación/llamadas de descanso, etc. (por ejemplo, someServiceMethod2 in) y quiero hacerlo seguro de manera transaccional. También tengo un repoMethod que incluye una transacción.
¿Cómo puedo revertir la transacción secundaria cuando la transacción principal lanza una excepción?

¿Hay alguna manera de unir estos dos métodos en una transacción? Al igual que lo haría la propagación TransactionDefinition.PROPAGATION_REQUIRED en la biblioteca Spring.

fun someServiceMethod () {
client.withTransaction { c ->
val bla = someServiceMethod2() // funciona

    someRepo.doSthRepoStuff(bla)) // funciona

    throw Exception("Solo para fines de prueba") // se bloquea -> también debería revertir la transacción de doSthRepoStuff
}

}

fun doSthRepoStuff(bla : String) {
client.withTransaction { c ->
// hacer cosas relacionadas con la base de datos aquí
}
}

La única forma en que pude hacerlo hasta ahora es utilizar solo la transacción de servicio y pasar la conexión al método de repo. Esto de alguna manera me parece extraño (darle a un método de repo una conexión SQL).

¿Hay alguna forma elegante de resolver esto?

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Sí, hay una forma de unir estos dos métodos en una transacción y revertir la transacción secundaria cuando la transacción principal lance una excepción. Puede utilizar la propagación TransactionDefinition.PROPAGATION_REQUIRED en Vert.x para lograr esto. Así es como puede modificar su código para usar este enfoque:

    fun someServiceMethod() {
      client.withTransaction { c ->
        val bla = someServiceMethod2() // funciona
    
        someRepo.doSthRepoStuff(c, bla) // funciona
      }
    }
    
    ...
    
    fun doSthRepoStuff(conn : SQLConnection, bla : String) {
      conn.withTransaction { tx -> 
        // hacer cosas relacionadas con la base de datos aquí
      }
    }
    

    En este enfoque, pasa la conexión SQL al método del repositorio y la utiliza para gestionar la transacción. De esta manera, ambos métodos operan dentro de la misma transacción y, si la transacción principal lanza una excepción, la transacción secundaria se revertirá.

    Este enfoque puede parecer un poco extraño si está acostumbrado/a a que el repositorio maneje sus transacciones de forma independiente de la capa de servicio. Sin embargo, es un patrón común en la gestión de transacciones con Vert.x y funciona bien para muchos casos de uso.

Comments are closed.