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