我有一个Grails应用程序,该应用程序执行API调用,获取回复,处理回复中的数据,然后在结果页面显示一些图表。
用户输入一些数据,然后单击一个按钮以执行。因此,如果两个用户同时或几乎同时单击该按钮而没有实施任何锁定,则结果是一个或两个都可能结束,而结果页面上未显示结果。我需要防止这种情况的发生,最好是使第二个请求等待,直到grails执行第一个请求。
我已经阅读了乐观锁定和悲观锁定,但没有什么能真正解释如何实现它以及在何处实现。在 Controller 中?在服务?
是这样的电话吗?在哪里?
myInstance.save flush:true, failOnError: true
感谢您对此有任何帮助,我无法找到很多有关此的信息。
最佳答案
您需要实现跨 session 请求锁定。
最简单的方法是使用单例映射来防止并行执行请求。可能看起来像:
class LockingSomethingController {
static scope = "singleton"
Map locks = new ConcurrentHashMap()
def lockMe( String id ) {
if( locks[ id ] ){
render status:400, text:'locked'
return
}
locks[ id ] = true
try{
doSomeSeriousStuff()
}finally{
locks.remove id
}
}
}
关于grails - 如何实现跨 session 请求锁定。,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51478497/