Play框架中的事务管理(scala)

Play框架中的事务管理(scala),scala,playframework,Scala,Playframework,我是一个新的in-Play框架,用于管理具有控制器、事务服务和dao层的java/spring风格的事务。对于我来说,在服务方法中使用dao进行乘法操作是非常常见的,如果出现问题,让他@Transactional回滚所有更改。服务与dao隔离,对数据库一无所知 但我在Anorm框架和游戏中没有发现类似的东西。所有逻辑都放在控制器中,您只能以这种丑陋的方式进行交易- 我们这里有几个问题: 服务变成dao 如果我们需要从另一个服务调用相同的dao方法,我们必须以相同的方式对其进行更改 有没有很好的方

我是一个新的in-Play框架,用于管理具有控制器、事务服务和dao层的java/spring风格的事务。对于我来说,在服务方法中使用dao进行乘法操作是非常常见的,如果出现问题,让他@Transactional回滚所有更改。服务与dao隔离,对数据库一无所知

但我在Anorm框架和游戏中没有发现类似的东西。所有逻辑都放在控制器中,您只能以这种丑陋的方式进行交易-

我们这里有几个问题:

  • 服务变成dao
  • 如果我们需要从另一个服务调用相同的dao方法,我们必须以相同的方式对其进行更改

  • 有没有很好的方法来管理正在进行的事务?像Slick这样的其他框架?如何在具有此类限制的生产环境中使用Play

    Anorm的DB.withTransaction在事务退出时创建并提交事务,因此您的用例没有现成的支持。尽管基于Anorm提供的跨多个服务创建您自己的事务引擎非常简单:如果ThreadLocal中不存在事务,它将创建一个事务并将其存储在那里,或者在后续的“事务”使用中使用从中获得的事务。然后,您可以有一个大型事务,它在dao层的深处回滚错误。我们在生产中有这样的解决方案,效果很好


    然而,有一个概念上的问题,你应该意识到。一旦您需要调用返回未来的服务,您就不再拥有事务(您可能在另一个线程上),或者您应该阻止事务(这在生产中不是一件好事)。

    请参见
    DB。withTransaction
    这是一个有问题的丑陋解决方案示例。或者我不知道如何正确烹调……没错,如果你觉得这是一种丑陋的方式,你需要阅读医生:)