grails - 如何实现跨 session 请求锁定。

标签 grails

我有一个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/

相关文章:

grails - 一个vs多个复选框

grails - 如何在grails域中创建自定义查询

grails - Grails 3数据库迁移

java - 为什么 YUIJsCompressorProcessor 类不包含在 wro4j 的核心或扩展 jar 中?

sorting - grails:在域类中测试 'sort' 映射

intellij-idea - 更新到 IntelliJ IDEA Ultimate 2016.2 后找不到 Grails 应用程序

spring - GRAILS-GORM:保存新对象期间出现DuplicateKeyException

email - Grails 邮件 Exchange 服务器配置

postgresql - Grails:是否可以查询PostgreSQL服务器版本?

eclipse - 为什么我无法下载STS?