Class Lock

Khoá

Hình minh hoạ một khoá loại trừ lẫn nhau.

Lớp này cho phép tập lệnh đảm bảo rằng chỉ một phiên bản của tập lệnh thực thi một phiên bản nhất định của từng phần mã cùng một lúc. Đ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 đó người dùng có thể gây ra thay đổi đối với tài nguyên dùng chung và bạn muốn đảm bảo rằng không có va chạm.

Ví dụ sau đây cho biết 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 gần như cùng một lúc, phiếu yêu cầu hỗ trợ các số liệu có thể vẫn là như nhau vì thuộc tính lastTicketNumber có thể thay đổi sau đó đượ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 khoá được có được.
releaseLock()voidMở khoá để 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 mở khoá, hết thời gian chờ ngoại trừ sau số lần được cung cấp mili giây.

Tài liệu chi tiết

hasLock()

Trả về true nếu khoá được có được. 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 – true nếu khoá được có, nếu không thì sẽ có giá trị false


releaseLock()

Mở khoá để các quy trình khác đang chờ khoá tiếp tục hoạt động. Khoá đang tự động phát hành khi tập lệnh chấm dứt, nhưng để hiệu quả, tốt nhất là phát hành tập lệnh đó ngay khi bạn 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 bạn chưa có khoá.

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 Bảng tínhApp.flush() trước khi mở khoá, để áp dụng 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 ứng dụ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 sẽ không có hiệu lực nếu khoá đã được sử dụng.

var lock = LockService.getScriptLock();
var 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 khoá được có, nếu không thì sẽ có giá trị false


waitLock(timeoutInMillis)

Cố gắng mở khoá, hết thời gian chờ ngoại trừ sau số lần được cung cấp mili giây. Phương thức này giống với tryLock(timeoutInMillis), ngoại trừ việc sẽ gửi một trường hợp ngoại lệ khi không thể có được 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.');
}

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 có được khoá