Class Lock

ล็อก

การนำเสนอการล็อกการยกเว้นร่วม

คลาสนี้ช่วยให้สคริปต์มั่นใจได้ว่าสคริปต์เพียง 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คำอธิบาย
timeoutInMillisIntegerเวลาที่ต้องรอในหน่วยมิลลิวินาทีเพื่อให้ได้ล็อก

รีเทิร์น

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คำอธิบาย
timeoutInMillisIntegerเวลาที่ต้องรอในหน่วยมิลลิวินาทีเพื่อให้ได้ล็อก

การขว้าง

Error — หากหมดเวลาของเมธอดก่อนที่จะได้ล็อก