代码之家  ›  专栏  ›  技术社区  ›  thesamet

玩滑溜和异步游戏——这是比赛条件吗?

  •  4
  • thesamet  · 技术社区  · 11 年前

    阅读 Play-Slick DBAction code ,我认为此代码可能包含一个竞赛条件:

    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)
          }
        }
      }
    }
    

    功能 r 在以后的某个时间运行 withSession 已返回Future[Result],并调用 session.close() 。此代码中是否存在竞争条件?

    2 回复  |  直到 11 年前
        1
  •  6
  •   EECOLOR    11 年前

    我不确定这是否被称为比赛条件。然而,在我看来,你是对的,这里出了问题。当将来执行代码时,会话可能不再有效。

    最好反转执行,并在将来请求数据库会话:

    Async {
      Future {
        DB.withSession{ s:scala.slick.session.Session =>
          r( RequestWithDbSession(request, s) )
        }
      }
    }
    
        2
  •  2
  •   cvogt    11 年前

    我认为你是对的,EECOLOR建议的解决方案看起来是正确的。我们正在跟踪一张罚单: https://github.com/freekh/play-slick/issues/81

    谢谢