Class Lock

잠그기

상호 배제 잠금의 표현입니다.

이 클래스를 사용하면 스크립트가 스크립트의 인스턴스 하나만 한 번에 지정된 코드 섹션을 실행하도록 할 수 있습니다. 이는 사용자 작업으로 인해 공유 리소스가 변경될 수 있고 충돌이 발생하지 않도록 하려는 콜백 및 트리거에 특히 유용합니다.

다음 예에서는 양식 제출 핸들러에서 잠금을 사용하는 방법을 보여줍니다.

// Generates a unique ticket number for every form submission.
function onFormSubmit(e) {
  const targetCell = e.range.offset(0, e.range.getNumColumns(), 1, 1);

  // Gets a script lock before modifying a shared resource.
  const lock = LockService.getScriptLock();
  // Waits for up to 30 seconds for other processes to finish.
  lock.waitLock(30000);

  const scriptProperties = PropertiesService.getScriptProperties();

  const ticketNumber =
      Number(scriptProperties.getProperty('lastTicketNumber')) + 1;
  scriptProperties.setProperty('lastTicketNumber', ticketNumber);

  // Releases the lock so that other processes can continue.
  lock.releaseLock();

  targetCell.setValue(ticketNumber);
}
잠금 서비스가 없으면 두 사용자가 거의 동시에 양식을 제출할 경우 lastTicketNumber 속성이 ScriptProperties에서 읽은 후 새 값이 다시 쓰여지기 전에 변경될 수 있으므로 티켓 번호가 동일해질 수 있습니다.

메서드

메서드반환 유형간략한 설명
hasLock()Boolean잠금이 실행된 경우 true를 반환합니다.
releaseLock()void잠금을 해제하여 잠금을 대기 중인 다른 프로세스가 계속 진행할 수 있도록 합니다.
tryLock(timeoutInMillis)Boolean잠금을 실행하려고 시도하며 제공된 밀리초 후에 시간 초과됩니다.
waitLock(timeoutInMillis)void잠금을 실행하려고 시도하며 제공된 밀리초 후에 예외와 함께 시간 초과됩니다.

자세한 문서

hasLock()

잠금이 실행된 경우 true를 반환합니다. tryLock(timeoutInMillis) 또는 waitLock(timeoutInMillis)이 호출되지 않았거나, 잠금을 검색하기 전에 시간 초과되었거나, releaseLock()이 호출된 경우 이 메서드는 false를 반환합니다.

const lock = LockService.getScriptLock();
lock.tryLock(10000);
if (!lock.hasLock()) {
  Logger.log('Could not obtain lock after 10 seconds.');
}

리턴

Boolean — 잠금이 실행된 경우 true, 그렇지 않은 경우 false입니다.


releaseLock()

잠금을 해제하여 잠금을 대기 중인 다른 프로세스가 계속 진행할 수 있도록 합니다. 스크립트가 종료되면 잠금이 자동으로 해제되지만 효율성을 위해 코드 섹션에 대한 독점 액세스가 더 이상 필요하지 않으면 잠금을 해제하는 것이 좋습니다. 잠금이 실행되지 않은 경우 이 메서드는 영향을 주지 않습니다.

스프레드시트를 사용하는 경우 잠금을 해제하기 전에 SpreadsheetApp.flush()를 호출하여 스프레드시트에 대한 독점 액세스 권한이 있는 동안 보류 중인 모든 변경사항을 스프레드시트에 커밋해야 합니다.

const lock = LockService.getScriptLock();
lock.waitLock(10000);
// Do some work on a shared resource.
lock.releaseLock();

tryLock(timeoutInMillis)

잠금을 실행하려고 시도하며 제공된 밀리초 후에 시간 초과됩니다. 잠금이 이미 실행된 경우 이 메서드는 영향을 주지 않습니다.

const lock = LockService.getScriptLock();
const success = lock.tryLock(10000);
if (!success) {
  Logger.log('Could not obtain lock after 10 seconds.');
}

매개변수

이름유형설명
timeoutInMillisInteger잠금을 실행하기 위해 대기하는 시간(밀리초)입니다.

리턴

Boolean — 잠금이 실행된 경우 true, 그렇지 않은 경우 false입니다.


waitLock(timeoutInMillis)

잠금을 실행하려고 시도하며 제공된 밀리초 후에 예외와 함께 시간 초과됩니다. 이 메서드는 false를 반환하는 대신 잠금을 실행할 수 없는 경우 예외를 발생시킨다는 점을 제외하면 tryLock(timeoutInMillis)과 동일합니다.

const lock = LockService.getScriptLock();
try {
  lock.waitLock(10000);
} catch (e) {
  Logger.log('Could not obtain lock after 10 seconds.');
}

매개변수

이름유형설명
timeoutInMillisInteger잠금을 실행하기 위해 대기하는 시간(밀리초)입니다.

생성 값

Error — 잠금을 실행하기 전에 메서드가 시간 초과된 경우