我们遇到Grails的交易问题。 在性能测试期间,我们有一个场景,其中为同一用户多次调用单个API。 在每次调用期间,域对象上的某些内容都会更改,并保存在数据库中。
我们发现,在将响应发送到客户端之后,以及在同一API的另一个请求到达服务器之前,可能会在数据库中进行更新。 所以我们最终得到另一个API调用,它在第一次API调用更新之前从数据库中选择数据,当第二个请求尝试在数据库中保存内容时,我们得到StaleObjectStateException。
我们在Grails中使用自动提交功能,在事务完成时保存所有内容。所以第一个决定是在控制器中的render()之前开始使用.save()。 这对于简单的API来说是可以的,但是我们确实有一些更复杂的API,我们必须跟踪很多对象并明确地保存它们。目前它似乎没有刷新工作:是的,但我们仍在测试。
所以我的问题是:有没有办法确保在Grails中提交事务之前没有发送响应?
答案 0 :(得分:0)
这可能是由于缓存,如果你需要保证db的状态,你需要.save(flush:true)。
请注意,这会在整个会话期间刷新,因此可能会以负面方式影响效果。
编辑: 不知道我是怎么设法阅读你的问题而没有看到你已经做过冲洗的部分:是的。
无论如何,这确实是你必须走的路。
答案 1 :(得分:0)
这是由于我们用于测试的工具 - SoapUI。它可以在响应返回之前发送重复请求。这让我们认为这是Grails的错。事实并非如此。