Class Lock

Khoá

Hình ảnh minh hoạ 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 chỉ có một bản sao của tập lệnh thực thi một phần mã nhất định tại mỗi thời điểm. Điều này đặc biệt hữu ích cho các lệnh gọi lại và điều kiện kích hoạt, trong đó một thao tác của người dùng có thể gây ra các thay đổi đối với tài nguyên dùng chung và bạn cần đảm bảo không có xung đột.

Ví dụ sau 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) {
  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);
}
Nếu không có dịch vụ Khoá, nếu hai người dùng gửi biểu mẫu vào cùng một thời điểm, 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ứcKiểu dữ liệu trả vềMô tả ngắn
hasLock()BooleanTrả về true nếu có khoá.
releaseLock()voidMở khoá, cho phép các quy trình khác đang chờ khoá tiếp tục hoạt động.
tryLock(timeoutInMillis)BooleanCố gắng có được khoá, hết thời gian chờ sau số mili giây đã cho.
waitLock(timeoutInMillis)voidCố gắng có được khoá, hết thời gian chờ với một ngoại lệ sau số mili giây đã cho.

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 từng được gọi, hết thời gian chờ trước khi truy xuất khoá, hoặc nếu releaseLock() được gọi.

var 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 – giá trị true (đúng) nếu đã sử dụng khoá, nếu không thì "false" (sai)


releaseLock()

Mở khoá, cho phép các quy trình khác đang chờ khoá tiếp tục hoạt động. Khoá tự động được huỷ khi tập lệnh chấm dứt, nhưng tốt nhất là bạn nên huỷ khoá ngay khi không còn cần quyền truy cập độc quyền vào một phần mã nữa. Phương thức này không có tác dụng nếu chưa có được khoá.

Lưu ý: nếu đang làm việc với một bảng tính, bạn nên gọi lương

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

tryLock(timeoutInMillis)

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

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

Các tham số

TênLoạiNội dung mô tả
timeoutInMillisIntegerthời gian chờ để có được khoá (tính bằng mili giây)

Cầu thủ trả bóng

Boolean – giá trị true (đúng) nếu đã sử dụng khoá, nếu không thì "false" (sai)


waitLock(timeoutInMillis)

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

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

Các tham số

TênLoạiNội dung mô 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 có được khoá