我们遇到了Grails的交易问题。
在性能测试期间,我们有一个场景,其中同一用户多次调用单个API。
在每次调用期间,域对象上的某些内容都会更改,然后将其保存在数据库中。

我们已经发现,有可能在响应发送到客户端之后并且在对同一API的另一个请求到达服务器之前,将在数据库中进行更新。
因此,我们以另一个API调用结束,该API调用在第一个API调用更新数据之前从数据库中选择数据,并且在第二个请求尝试将内容保存在数据库中时得到StaleObjectStateException。

我们在Grails中使用了自动提交功能,该功能可以在事务完成时保存所有内容。因此,第一个决定是在 Controller 中的render()之前开始使用.save()。
对于简单的API可以这样做,但是我们确实有一些更复杂的API,我们必须跟踪很多对象并显式保存它们。目前,它在没有flush:true的情况下似乎可以正常工作,但我们仍在测试中。

所以我的问题是:有什么方法可以确保在Grails中提交事务之前不会发送响应?

请您参考如下方法:

这可能是由于缓存所致,如果您需要有关db状态的保证,则需要.save(flush:true)。

请注意,这会刷新整个 session ,因此可能会对性能产生负面影响。

编辑:
不知道我如何设法阅读您的问题而没有看到有关您已经在进行flush:true的部分。

无论如何,这确实是您必须走的路。


评论关闭
IT序号网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!