我有一个Grails应用程序,该应用程序执行API调用,获取回复,处理回复中的数据,然后在结果页面显示一些图表。
用户输入一些数据,然后单击一个按钮以执行。因此,如果两个用户同时或几乎同时单击该按钮,则没有实施任何锁定,结果是一个或两个都可能结束,而结果页面上没有绘制结果。我需要防止这种情况的发生,最好是让第二个请求等到grails执行第一个请求。
我已经阅读了乐观锁定和悲观锁定,但是没有什么能真正解释如何实现它以及在何处实现。在控制器中?在服务?
是这样的电话吗?在哪里?
myInstance.save flush:true, failOnError: true
任何帮助您理解这一点的人,我都无法找到关于此的大量信息。
答案 0 :(得分:0)
您需要实现跨会话请求锁定。
最简单的方法是使用单例映射来防止并行执行请求。可能看起来像:
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
}
}
}