การนําเสนอการล็อกแบบยกเว้นซึ่งกันและกัน
คลาสนี้ช่วยให้สคริปต์ตรวจสอบได้ว่ามีเพียงอินสแตนซ์เดียวของสคริปต์ที่เรียกใช้ส่วนโค้ดหนึ่งๆ ในแต่ละครั้ง ซึ่งจะเป็นประโยชน์อย่างยิ่งสําหรับการเรียกกลับและทริกเกอร์ในกรณีที่การดําเนินการของผู้ใช้อาจทําให้เกิดการเปลี่ยนแปลงทรัพยากรที่แชร์ และคุณต้องการตรวจสอบว่าไม่มีการทับซ้อนกัน
ตัวอย่างต่อไปนี้แสดงวิธีใช้ล็อกในตัวจัดการการส่งแบบฟอร์ม
// 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
อาจเปลี่ยนแปลงหลังจากอ่านจาก Script Properties
แต่ก่อนที่ระบบจะเขียนค่าใหม่กลับเข้าไปเมธอด
วิธีการ | ประเภทการแสดงผล | รายละเอียดแบบย่อ |
---|---|---|
has | Boolean | แสดงผลเป็น "จริง" หากได้รับข้อมูลล็อก |
release | void | ปล่อยการล็อกเพื่อให้กระบวนการอื่นๆ ที่รอการล็อกดำเนินการต่อได้ |
try | Boolean | พยายามขอล็อก โดยระบบจะหมดเวลาหลังจากผ่านไปตามจำนวนมิลลิวินาทีที่ระบุ |
wait | void | พยายามขอล็อก โดยหมดเวลาพร้อมกับข้อยกเว้นหลังจากผ่านไปตามจำนวนมิลลิวินาทีที่ระบุ |
เอกสารประกอบโดยละเอียด
has Lock()
แสดงผลเป็น "จริง" หากได้รับข้อมูลล็อก เมธอดนี้จะแสดงผลเป็นเท็จหากไม่เคยมีการเรียกใช้ try
หรือ wait
, หมดเวลาก่อนที่จะดึงข้อมูลล็อกได้ หรือมีการเรียกใช้ release
const lock = LockService.getScriptLock(); lock.tryLock(10000); if (!lock.hasLock()) { Logger.log('Could not obtain lock after 10 seconds.'); }
รีเทิร์น
Boolean
— จริงหากได้รับสิทธิ์เข้าถึงล็อก มิเช่นนั้นจะเป็นเท็จ
release Lock()
ปล่อยการล็อกเพื่อให้กระบวนการอื่นๆ ที่รอการล็อกดำเนินการต่อได้ ระบบจะปลดล็อกโดยอัตโนมัติเมื่อสคริปต์สิ้นสุดการทำงาน แต่คุณควรปลดล็อกทันทีที่ไม่จำเป็นต้องเข้าถึงโค้ดส่วนใดส่วนหนึ่งแบบไม่จำกัดอีกต่อไปเพื่อประสิทธิภาพการทำงาน วิธีนี้จะไม่มีผลหากยังไม่ได้ซื้อล็อก
โปรดทราบว่าหากทํางานกับสเปรดชีต คุณควรเรียกใช้ SpreadsheetApp.flush() ก่อนปล่อยการล็อกเพื่อบันทึกการเปลี่ยนแปลงทั้งหมดที่รอดําเนินการในสเปรดชีตขณะที่คุณยังมีสิทธิ์เข้าถึงแบบพิเศษ
const lock = LockService.getScriptLock(); lock.waitLock(10000); // Do some work on a shared resource. lock.releaseLock();
try Lock(timeoutInMillis)
พยายามขอล็อก โดยระบบจะหมดเวลาหลังจากผ่านไปตามจำนวนมิลลิวินาทีที่ระบุ วิธีนี้จะไม่มีผลหากมีการล็อกไว้แล้ว
const lock = LockService.getScriptLock(); const success = lock.tryLock(10000); if (!success) { Logger.log('Could not obtain lock after 10 seconds.'); }
พารามิเตอร์
ชื่อ | ประเภท | คำอธิบาย |
---|---|---|
timeout | Integer | ระยะเวลาที่รอเพื่อรับการล็อกเป็นมิลลิวินาที |
รีเทิร์น
Boolean
— จริงหากได้รับสิทธิ์เข้าถึงล็อก มิเช่นนั้นจะเป็นเท็จ
wait Lock(timeoutInMillis)
พยายามขอล็อก โดยหมดเวลาพร้อมกับข้อยกเว้นหลังจากผ่านไปตามจำนวนมิลลิวินาทีที่ระบุ เมธอดนี้เหมือนกับ try
ยกเว้นว่าจะแสดงข้อยกเว้นเมื่อรับล็อกไม่ได้แทนที่จะแสดงผลเป็นเท็จ
const lock = LockService.getScriptLock(); try { lock.waitLock(10000); } catch (e) { Logger.log('Could not obtain lock after 10 seconds.'); }
พารามิเตอร์
ชื่อ | ประเภท | คำอธิบาย |
---|---|---|
timeout | Integer | ระยะเวลาที่รอเพื่อรับการล็อกเป็นมิลลิวินาที |
โยน
Error
— หากเมธอดหมดเวลาก่อนที่จะได้รับล็อก