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); }
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 | Kiểu dữ liệu trả về | Mô tả ngắn |
|---|---|---|
has | Boolean | Trả về true nếu khoá đã được lấy. |
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 đã 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 khoá đã được lấy. Phương thức này trả về 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 khoá đã được lấy, 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ả, 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();
try Lock(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ê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 khoá đã được lấy, 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 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ê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