代码之家  ›  专栏  ›  技术社区  ›  beano

针对同一脚本的LockService操作太多

  •  3
  • beano  · 技术社区  · 6 年前

    var lock = LockService.getDocumentLock();
    var success = lock.tryLock(240000); // 4 minutes
    if (!success) {
    console.warn('Could not obtain lock after 4 minutes.');
    return;
    }
    //perform some function then release lock
    lock.releaseLock();
    

    我继续收到错误消息:

    针对同一脚本的LockService操作太多。

    最初我认为这个错误是“基于用户”的,并且可能有一个针对锁服务操作数的配额 每个用户 不过,我最近开始看到,在过去几天里,它出现的频率更高,超过30个用户。

    LockService操作的数量有限制吗 每个用户 每个脚本 ?

    我看不到任何关于 Google Apps Script quotas

    我也没有看到任何关于 LockService documentation

    2 回复  |  直到 6 年前
        1
  •  3
  •   Marcono1234    5 年前

    有一篇报道说: https://issuetracker.google.com/issues/112384851

    看来这可能是偶然发生的。一名谷歌员工回应如下:

    1) 在LockService调用周围使用try/catch块,并假设一个错误意味着“lock was not acquired”(无论这对于脚本试图执行的逻辑意味着什么)。

    2) 如果“lock was not acquired”表示“script should try again”,则在重试LockService操作之前,在其中休眠几秒钟(甚至可能是指数后退)。

        2
  •  2
  •   beano    6 年前

    我不知道这个问题的答案(所以我不会将这个答案标记为已接受),但这里是我的解决方法。

    不是最优雅的解决方案,因为它不能保护所有的情况(触发器运行在快速连续,有时触发器运行在顺序之外),所以任何来自更有经验的指导都是值得赞赏的。

    try{
    
      for(var i=1; i<11; i++){ //attempt 10 times, then run and hope for the best
        var documentLock = PropertiesService.getDocumentProperties().getProperty('documentLock');
        if(documentLock){
        Utilities.sleep(20000); //if locked, sleep for 20 seconds
        console.log('Wait ' + i + ' for documentLock to be released.');
        }else{break;}
      }
    
      PropertiesService.getDocumentProperties().setProperty('documentLock', true);
    
      runSomeFunction()
    
    }
    catch(err){
    
      console.error(err);
      console.error(err["stack"]);
    
    }
    finally{
    
      PropertiesService.getDocumentProperties().deleteProperty('documentLock');
    
    }
    
        3
  •  1
  •   Amit Agarwal    6 年前