Class Lock

Kunci

Representasi kunci saling-pengecualian.

Class ini memungkinkan skrip memastikan bahwa hanya satu instance skrip yang menjalankan bagian kode tertentu dalam satu waktu. Hal ini sangat berguna untuk callback dan pemicu, saat tindakan pengguna dapat menyebabkan perubahan pada resource bersama dan Anda ingin memastikan tidak ada konflik.

Contoh berikut menunjukkan cara menggunakan kunci di pengendali pengiriman formulir.

// 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);
}
Tanpa layanan Lock, jika dua pengguna mengirimkan formulir pada waktu yang hampir bersamaan, nomor tiket dapat berakhir sama, karena properti lastTicketNumber dapat berubah setelah dibaca dari ScriptProperties, tetapi sebelum nilai baru ditulis kembali.

Metode

MetodeJenis hasil yang ditampilkanDeskripsi singkat
hasLock()BooleanMenampilkan true jika kunci diperoleh.
releaseLock()voidMelepaskan kunci, sehingga proses lain yang menunggu kunci dapat dilanjutkan.
tryLock(timeoutInMillis)BooleanMencoba mendapatkan kunci, waktu tunggu habis setelah jumlah milidetik yang diberikan.
waitLock(timeoutInMillis)voidMencoba mendapatkan kunci, waktu tunggu habis dengan pengecualian setelah jumlah milidetik yang diberikan.

Dokumentasi mendetail

hasLock()

Menampilkan true jika kunci diperoleh. Metode ini akan menampilkan nilai salah jika tryLock(timeoutInMillis) atau waitLock(timeoutInMillis) tidak pernah dipanggil, waktu tunggu habis sebelum kunci dapat diambil, atau jika releaseLock() dipanggil.

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

Pulang pergi

Boolean — benar jika kunci diperoleh, salah jika tidak


releaseLock()

Melepaskan kunci, sehingga proses lain yang menunggu kunci dapat dilanjutkan. Kunci akan otomatis dilepaskan saat skrip dihentikan, tetapi untuk efisiensi, sebaiknya lepaskan segera setelah Anda tidak lagi memerlukan akses eksklusif ke bagian kode. Metode ini tidak berpengaruh jika kunci belum diperoleh.

Perhatikan bahwa jika Anda menggunakan spreadsheet, Anda harus memanggil SpreadsheetApp.flush() sebelum melepaskan kunci, untuk melakukan semua perubahan yang tertunda ke spreadsheet saat Anda masih memiliki akses eksklusif ke spreadsheet tersebut.

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

tryLock(timeoutInMillis)

Mencoba mendapatkan kunci, waktu tunggu habis setelah jumlah milidetik yang diberikan. Metode ini tidak berpengaruh jika kunci telah diperoleh.

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

Parameter

NamaJenisDeskripsi
timeoutInMillisIntegerdurasi waktu tunggu untuk mendapatkan kunci, dalam milidetik

Pulang pergi

Boolean — benar jika kunci diperoleh, salah jika tidak


waitLock(timeoutInMillis)

Mencoba mendapatkan kunci, waktu tunggu habis dengan pengecualian setelah jumlah milidetik yang diberikan. Metode ini sama dengan tryLock(timeoutInMillis), kecuali bahwa metode ini menampilkan pengecualian saat kunci tidak dapat diperoleh, bukan menampilkan nilai salah (false).

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

Parameter

NamaJenisDeskripsi
timeoutInMillisIntegerdurasi waktu tunggu untuk mendapatkan kunci, dalam milidetik

Menampilkan

Error — jika waktu tunggu metode habis sebelum kunci diperoleh