Class Lock

잠그기

상호 제외 잠금을 표현한 것입니다.

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

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

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

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

  var ticketNumber = Number(ScriptProperties.getProperty('lastTicketNumber')) + 1;
  ScriptProperties.setProperty('lastTicketNumber', ticketNumber);

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

  targetCell.setValue(ticketNumber);
}
잠금 서비스 사용 시에는 두 사용자가 거의 동시에 양식을 제출하면 티켓 번호가 같아질 수 있습니다. ScriptProperties에서 lastTicketNumber 속성을 읽은 후 새 값이 다시 쓰여지기 전에 lastTicketNumber 속성이 변경될 수 있기 때문입니다.

방법

메서드반환 유형간략한 설명
hasLock()Boolean잠금을 획득한 경우 true를 반환합니다.
releaseLock()void잠금을 해제하여 잠금을 대기 중인 다른 프로세스가 계속 진행되도록 합니다.
tryLock(timeoutInMillis)Boolean잠금 획득을 시도하며 제공된 시간(밀리초)이 지나면 타임아웃됩니다.
waitLock(timeoutInMillis)void잠금 획득을 시도하며, 제공된 밀리초 이후에 예외와 함께 타임아웃됩니다.

자세한 문서

hasLock()

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

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

리턴

Boolean: 잠금이 획득한 경우 true, 그렇지 않은 경우 false입니다.


releaseLock()

잠금을 해제하여 잠금을 대기 중인 다른 프로세스가 계속 진행되도록 합니다. 스크립트가 종료되면 잠금이 자동으로 해제되지만, 효율성을 위해 코드 섹션에 독점적으로 액세스할 필요가 없는 즉시 해제하는 것이 가장 좋습니다. 잠금이 설정되지 않은 경우 이 메서드는 아무런 영향을 미치지 않습니다.

스프레드시트로 작업하는 경우 잠금을 해제하기 전에 스프레드시트앱.플러시()를 호출하여 독점 액세스 권한을 유지하면서 대기 중인 모든 변경사항을 스프레드시트에 커밋해야 합니다.

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

tryLock(timeoutInMillis)

잠금 획득을 시도하며 제공된 시간(밀리초)이 지나면 타임아웃됩니다. 이미 잠금을 획득한 경우에는 이 메서드가 영향을 미치지 않습니다.

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

매개변수

이름유형설명
timeoutInMillisInteger잠금을 획득하기까지 기다리는 시간(밀리초)

리턴

Boolean: 잠금이 획득한 경우 true, 그렇지 않은 경우 false입니다.


waitLock(timeoutInMillis)

잠금 획득을 시도하며, 제공된 밀리초 이후에 예외와 함께 타임아웃됩니다. 이 메서드는 false를 반환하는 대신 잠금을 획득할 수 없을 때 예외가 발생한다는 점을 제외하면 tryLock(timeoutInMillis)와 동일합니다.

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

매개변수

이름유형설명
timeoutInMillisInteger잠금을 획득하기까지 기다리는 시간(밀리초)

생성 값

Error: 잠금이 설정되기 전에 메서드가 타임아웃된 경우