Class Lock

Khoá

Biểu thị một khoá loại trừ lẫn nhau.

Lớp này cho phép các tập lệnh đảm bảo rằng tại mỗi thời điểm, chỉ một thực thể của tập lệnh thực thi một phần mã nhất định. Điều này đặc biệt hữu ích đối với các lệnh gọi lại và trình kích hoạt, trong đó một thao tác của người dùng có thể gây ra thay đổi đối với một tài nguyên dùng chung và bạn muốn đảm bảo không có xung đột.

Ví dụ sau đây cho thấy cách sử dụng khoá trong trình xử lý gửi biểu mẫu.

// 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);
}
Nếu không có dịch vụ Khoá, nếu hai người dùng gửi biểu mẫu gần như cùng một lúc, thì số phiếu yêu cầu hỗ trợ có thể giống nhau, vì thuộc tính lastTicketNumber có thể thay đổi sau khi được đọc từ ScriptProperties nhưng trước khi giá trị mới được ghi lại.

Phương thức

Phương thứcLoại dữ liệu trả vềMô tả ngắn
hasLock()BooleanTrả về true nếu đã có khoá.
releaseLock()voidGiải phóng khoá, cho phép các quy trình khác đang chờ khoá tiếp tục.
tryLock(timeoutInMillis)BooleanCố gắng lấy khoá, hết thời gian chờ sau số mili giây được cung cấp.
waitLock(timeoutInMillis)voidCố gắng lấy khoá, hết thời gian chờ với một ngoại lệ sau số mili giây đã cung cấp.

Tài liệu chi tiết

hasLock()

Trả về true nếu đã có khoá. Phương thức này sẽ trả về giá trị false nếu tryLock(timeoutInMillis) hoặc waitLock(timeoutInMillis) chưa bao giờ được gọi, hết thời gian chờ trước khi có thể truy xuất khoá hoặc nếu releaseLock() đã được gọi.

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

Cầu thủ trả bóng

Boolean – true nếu đã có khoá, false nếu không


releaseLock()

Giải phóng khoá, cho phép các quy trình khác đang chờ khoá tiếp tục. Khoá sẽ tự động được giải phóng khi tập lệnh kết thúc, nhưng để đạt được hiệu quả cao nhất, tốt nhất bạn nên giải phóng khoá ngay khi không còn cần quyền truy cập độc quyền vào một phần mã. Phương thức này không có hiệu lực nếu bạn chưa có khoá.

Xin lưu ý rằng nếu đang làm việc với một bảng tính, bạn nên gọi SpreadsheetApp.flush() trước khi nhả khoá để xác nhận tất cả các thay đổi đang chờ xử lý đối với bảng tính trong khi bạn vẫn có quyền truy cập độc quyền vào bảng tính đó.

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

tryLock(timeoutInMillis)

Cố gắng lấy khoá, hết thời gian chờ sau số mili giây được cung cấp. Phương thức này không có hiệu lực nếu khoá đã được lấy.

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

Tham số

TênLoạiMô tả
timeoutInMillisIntegerthời gian chờ để có được khoá, tính bằng mili giây

Cầu thủ trả bóng

Boolean – true nếu đã có khoá, false nếu không


waitLock(timeoutInMillis)

Cố gắng lấy khoá, hết thời gian chờ với một ngoại lệ sau số mili giây đã cung cấp. Phương thức này giống với tryLock(timeoutInMillis), ngoại trừ việc phương thức này sẽ gửi một ngoại lệ khi không thể lấy được khoá thay vì trả về giá trị false.

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

Tham số

TênLoạiMô tả
timeoutInMillisIntegerthời gian chờ để có được khoá, tính bằng mili giây

Gửi

Error – nếu phương thức hết thời gian chờ trước khi khoá được lấy