play framework evolutions scala playframework play-slick

scala - play framework evolutions



Play slick y Async: ¿es una condición de carrera? (2)

Leyendo el código de DBAction Play-Slick , pensé que este código podría contener una condición de carrera:

object DBAction{ // snip def apply(r: (RequestWithDbSession) => Result)(implicit app:Application) = { Action { implicit request => AsyncResult { DB.withSession{ s:scala.slick.session.Session => Future(r( RequestWithDbSession(request,s) ))(executionContext) } } } }

La función r ejecuta en un momento futuro, después de que withSession haya devuelto un Future [Result] y se llame a session.close() . ¿Hay una condición de carrera en este código?



No estoy seguro si eso se llama una condición de carrera. Sin embargo, para mí parece que tienes razón en que algo está mal aquí. Es posible que la sesión ya no sea válida cuando el futuro ejecute el código.

Sería mejor invertir la ejecución y solicitar una sesión de base de datos en el futuro:

Async { Future { DB.withSession{ s:scala.slick.session.Session => r( RequestWithDbSession(request, s) ) } } }