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

时间:2017-11-12 18:30:55

标签: scala playframework

我是Play Framework的新手,用于通过控制器,事务服务和dao层管理java / spring风格的事务。对于我来说,通常情况下在服务方法中使用dao进行乘法运算,如果出现问题,让@Transactional回滚所有更改。服务与dao隔离,对数据库一无所知。

但是我在Anorm框架和Play中没有找到类似的东西。所有逻辑都放在控制器中,你只能以这种丑陋的方式进行交易 - Database transactions in Play framework scala applications (anorm)

我们在这里有几个问题:

  1. 服务变成dao
  2. 如果我们需要从另一个服务调用相同的dao方法,我们将以相同的方式更改
  3. 有没有很好的方法来管理Play中的交易?像Slick这样的其他框架?如何在具有此类限制的生产中使用Play

1 个答案:

答案 0 :(得分:0)

Anorm的DB.withTransaction在退出时创建并提交事务,因此对您的用例没有开箱即用的支持。虽然根据Anorm提供的跨越多个服务的方式创建自己的事务引擎非常简单:如果ThreadLocal中不存在任何事务,它会创建一个事务并将其存储在那里或使用从后续“事务”用法中获取的事务。然后你可以有一个大的事务,在dao层深处的错误上回滚。我们在生产中有这样的解决方案并且工作正常。

但是,您应该注意一个概念性问题。只要您需要调用返回Future的服务,您就不再拥有该事务(您可能在另一个线程上)或者您应该阻止(这在生产中不是一件好事)。