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);
}
Lock 서비스가 없으면 두 사용자가 거의 동시에 양식을 제출하는 경우 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: 잠금이 획득되기 전에 메서드의 시간이 초과된 경우