使控制器事务控制器

mon*_*nda 3 grails

在我的控制器中,我有一个更新2个域类的动作.

我希望它以这样的方式制作,如果第二次更新失败,第一次更新应该回滚,基本上如果有错误,所有先前的操作都应该回滚.

这里的基本想法是什么?

th3*_*org 9

如果您不想将逻辑移动到服务(可能是因为您可能正在调用多个服务来执行这两个更新),请controller action使用@Transactional.

public MyController {
 @Transactional
 def save(){
   myService.save(params)
   myOtherService.save(params)
   render "success"
 }

 ...

}
Run Code Online (Sandbox Code Playgroud)

  • 虽然这可能有用,但它在您的代码中有异味.责任分离说控制人不应该对交易负责.创建一个调用另外两个服务的服务,然后从控制器调用它 (4认同)
  • 谢谢,这是真正的解决方案。我经常需要在控制器中调用多个服务,这在这种情况下似乎很完美。 (2认同)

rxn*_*n1d 7

只需将您的所有业务逻辑移动到已经是事务性的服务.使用一个服务进行第一次更新操作,使用另一个服


Eyl*_*len 6

检查服务,默认情况下它们是交易的.只需在那里进行更新,如果有错误则抛出异常并在控制器中捕获它