我想知道是否可以回滚多个更改。
例如
假设在控制器内部我连续有三个域保存。
domain1.save(flush:true)
domain2.save(flush:true)
domain3.save(flush:true)
现在我希望行为是这样的,如果这三个保存中的任何一个失败,那么成功的保存也应该回滚,即我希望所有这三个保存构成单个事务。我想知道是否有办法在grails中做到这一点?我发现withTransaction但似乎与特定域相关联。谢谢!寻求帮助。
答案 0 :(得分:2)
withTransaction
与它所调用的域类无关,但它有点像黑客,因为它可以让你做一些愚蠢的事情,比如控制器中的事务持久性。控制器应该专注于与HTTP相关的东西,并将实际工作委托给服务,默认情况下这些服务是方便的事务处理,除非你为特定服务禁用它。
将所有数据库更新和业务逻辑移动到服务,并使控制器保持轻量级,并专注于提取请求参数和进行数据绑定(例如,通过{{1}将字符串" 12453"转换为int 12453并使用该数据调用服务方法,然后将它们的返回值传递给要呈现的视图。控制器应该只是路由器。
如果需要,可以使用int foo = params.int('foo')
注释来自定义事务对整个服务或每个方法的工作方式,但默认情况下,即使没有任何注释,服务也是事务性的。您可以在方法中执行任意数量的工作,它将全部成功或全部回滚。我甚至在事务方法中进行单个更新/删除/插入,以便以后简单地使事情变得更复杂,而不必考虑事务。如果所有数据库更改都是事务性的,那么事情通常会运行得更好。
答案 1 :(得分:0)
伯特,谢谢你的解释。它有助于。 MVC成为MVCS。 但请再说一遍: 我曾经理解,即使没有调用.save(),控制器也会想要保存更新的类(在绑定新的参数之后)_on_his_own_。 这会如何干扰中间调用的服务中已处理/保存的类? 或者控制器只从String创建一个Integer,并将更正后的params进一步传递给服务,然后执行所有的操作,控制器在MVC世界中做得更早?
编辑和后期反应: 很抱歉没有足够的评论声明