Spring 如何避免在事务保存在Grails中之前发送响应?

Spring 如何避免在事务保存在Grails中之前发送响应?,spring,grails,transactions,Spring,Grails,Transactions,我们遇到了Grails的事务问题。 在性能测试期间,我们有一个场景,同一个用户多次调用单个API。 在每次调用过程中,域对象上的某些内容都会发生更改,并保存在数据库中 我们已经发现,数据库中的更新有可能在响应发送到客户机之后,在对相同API的另一个请求到达服务器之前进行。 所以,我们最终得到另一个API调用,它在第一个API调用更新数据库之前从数据库中选择数据,当第二个请求试图在数据库中保存数据时,我们得到StaleObjectStateException 我们在Grails中使用了自动提交功能

我们遇到了Grails的事务问题。 在性能测试期间,我们有一个场景,同一个用户多次调用单个API。 在每次调用过程中,域对象上的某些内容都会发生更改,并保存在数据库中

我们已经发现,数据库中的更新有可能在响应发送到客户机之后,在对相同API的另一个请求到达服务器之前进行。 所以,我们最终得到另一个API调用,它在第一个API调用更新数据库之前从数据库中选择数据,当第二个请求试图在数据库中保存数据时,我们得到StaleObjectStateException

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


所以我的问题是:有没有办法确保在Grails中提交事务之前不发送响应?

这可能是由于缓存,如果您需要保证数据库的状态,则需要保存(flush:true)

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

编辑: 我不知道我是怎么读到你的问题的,却没有看到你已经在做flush的部分:真的


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

这可能是由于缓存,如果您需要保证数据库的状态,则需要.save(flush:true)

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

编辑: 我不知道我是怎么读到你的问题的,却没有看到你已经在做flush的部分:真的


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

这是由于我们用于测试的工具——SoapUI。它可以在响应返回之前发送重复的请求。这让我们认为这是Grails的失误。事实并非如此。

这是由于我们用于测试的工具—SoapUI。它可以在响应返回之前发送重复的请求。这让我们认为这是Grails的失误。不是的。

是的,我就是这么做的。但我正在寻找一种不让你失望的方法。我不想跟踪所有更改/修改以明确保存它们。但似乎我别无选择:/是的,我就是这么做的。但我正在寻找一种不让你失望的方法。我不想跟踪所有更改/修改以明确保存它们。但似乎我别无选择:/你有没有试着用一种语言来包装你的逻辑?在我看来,在服务调用中进行处理会有所帮助。我必须尝试一下。目前,在创建对所有API的响应时,我们正在对对象进行一些检查,这可能会导致更新,因此我们必须事先将其移动到那里。谢谢你的建议。你有没有试着把你的逻辑包装在一个文件里?在我看来,在服务调用中进行处理会有所帮助。我必须尝试一下。目前,在创建对所有API的响应时,我们正在对对象进行一些检查,这可能会导致更新,因此我们必须事先将其移动到那里。谢谢你的建议。