如何实现跨会话请求锁定。

时间:2018-07-23 12:11:40

标签: grails

我有一个Grails应用程序,该应用程序执行API调用,获取回复,处理回复中的数据,然后在结果页面显示一些图表。

用户输入一些数据,然后单击一个按钮以执行。因此,如果两个用户同时或几乎同时单击该按钮,则没有实施任何锁定,结果是一个或两个都可能结束,而结果页面上没有绘制结果。我需要防止这种情况的发生,最好是让第二个请求等到grails执行第一个请求。

我已经阅读了乐观锁定和悲观锁定,但是没有什么能真正解释如何实现它以及在何处实现。在控制器中?在服务?

是这样的电话吗?在哪里?

 myInstance.save flush:true, failOnError: true

任何帮助您理解这一点的人,我都无法找到关于此的大量信息。

1 个答案:

答案 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
    }
  }
}