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); }
last Ticket Number
có thể thay đổi sau khi được đọc từ Script Properties
nhưng trước khi giá trị mới được ghi lại.Phương thức
Phương thức | Loại dữ liệu trả về | Mô tả ngắn |
---|---|---|
has | Boolean | Trả về true nếu đã có khoá. |
release | void | Giải phóng khoá, cho phép các quy trình khác đang chờ khoá tiếp tục. |
try | Boolean | Cố gắng lấy khoá, hết thời gian chờ sau số mili giây được cung cấp. |
wait | void | 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. |
Tài liệu chi tiết
has Lock()
Trả về true nếu đã có khoá. Phương thức này sẽ trả về giá trị false nếu try
hoặc wait
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 release
đã đượ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
release Lock()
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();
try Lock(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ên | Loại | Mô tả |
---|---|---|
timeout | Integer | thờ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
wait Lock(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 try
, 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ên | Loại | Mô tả |
---|---|---|
timeout | Integer | thờ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