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);
}
잠금 서비스가 없으면 두 사용자가 거의 동시에 양식을 제출하면 티켓 번호는 결국 달라질 수 있습니다. lastTicketNumber 속성을 ScriptProperties에서 읽은 후 새 값을 다시 쓰기 전에 변경할 수 있기 때문입니다.

방법

메서드반환 유형간략한 설명
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 — 잠금 획득 전에 메서드 시간이 초과된 경우