Class Lock

Khoá

Biểu diễn khoá loại trừ lẫn nhau.

Lớp này cho phép tập lệnh đảm bảo rằng tại một thời điểm, chỉ có một phiên bản 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 cho các lệnh gọi lại và trình kích hoạt, trong đó hành động của người dùng có thể gây ra các thay đổi đối với một tài nguyên dùng chung và bạn muốn đảm bảo rằng 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ụ Lock, nếu hai người dùng gửi biểu mẫu cùng lúc, thì số vé 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ứcKiểu dữ liệu trả vềMô tả ngắn
hasLock()BooleanTrả về true nếu khoá đã được lấy.
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 đã 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 khoá đã được lấy. Phương thức này trả về 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

Booleantrue nếu khoá đã được lấy, 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ả, tốt nhất là 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 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 phát hà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 đã cung cấp. Phương thức này không có tác dụng 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.');
}

Thông 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

Booleantrue nếu khoá đã được lấy, 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 khoá thay vì trả về false.

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

Thông 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