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?
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: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.