Class Lock

ล็อก

การนําเสนอการล็อกแบบยกเว้นซึ่งกันและกัน

คลาสนี้ช่วยให้สคริปต์ตรวจสอบได้ว่ามีเพียงอินสแตนซ์เดียวของสคริปต์ที่เรียกใช้ส่วนโค้ดหนึ่งๆ ในแต่ละครั้ง ซึ่งจะเป็นประโยชน์อย่างยิ่งสําหรับการเรียกกลับและทริกเกอร์ในกรณีที่การดําเนินการของผู้ใช้อาจทําให้เกิดการเปลี่ยนแปลงทรัพยากรที่แชร์ และคุณต้องการตรวจสอบว่าไม่มีการทับซ้อนกัน

ตัวอย่างต่อไปนี้แสดงวิธีใช้ล็อกในตัวจัดการการส่งแบบฟอร์ม

// 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);
}
หากไม่มีบริการล็อก หากผู้ใช้ 2 คนส่งแบบฟอร์มในเวลาใกล้เคียงกัน หมายเลขคำขอแจ้งปัญหาอาจเหมือนกัน เนื่องจากพร็อพเพอร์ตี้ lastTicketNumber อาจเปลี่ยนแปลงหลังจากอ่านจาก ScriptProperties แต่ก่อนที่ระบบจะเขียนค่าใหม่กลับเข้าไป

เมธอด

วิธีการประเภทการแสดงผลรายละเอียดแบบย่อ
hasLock()Booleanแสดงผลเป็น "จริง" หากได้รับข้อมูลล็อก
releaseLock()voidปล่อยการล็อกเพื่อให้กระบวนการอื่นๆ ที่รอการล็อกดำเนินการต่อได้
tryLock(timeoutInMillis)Booleanพยายามขอล็อก โดยระบบจะหมดเวลาหลังจากผ่านไปตามจำนวนมิลลิวินาทีที่ระบุ
waitLock(timeoutInMillis)voidพยายามขอล็อก โดยหมดเวลาพร้อมกับข้อยกเว้นหลังจากผ่านไปตามจำนวนมิลลิวินาทีที่ระบุ

เอกสารประกอบโดยละเอียด

hasLock()

แสดงผลเป็น "จริง" หากได้รับข้อมูลล็อก เมธอดนี้จะแสดงผลเป็นเท็จหากไม่เคยมีการเรียกใช้ tryLock(timeoutInMillis) หรือ waitLock(timeoutInMillis), หมดเวลาก่อนที่จะดึงข้อมูลล็อกได้ หรือมีการเรียกใช้ releaseLock()

const lock = LockService.getScriptLock();
lock.tryLock(10000);
if (!lock.hasLock()) {
  Logger.log('Could not obtain lock after 10 seconds.');
}

รีเทิร์น

Boolean — จริงหากได้รับสิทธิ์เข้าถึงล็อก มิเช่นนั้นจะเป็นเท็จ


releaseLock()

ปล่อยการล็อกเพื่อให้กระบวนการอื่นๆ ที่รอการล็อกดำเนินการต่อได้ ระบบจะปลดล็อกโดยอัตโนมัติเมื่อสคริปต์สิ้นสุดการทำงาน แต่คุณควรปลดล็อกทันทีที่ไม่จำเป็นต้องเข้าถึงโค้ดส่วนใดส่วนหนึ่งแบบไม่จำกัดอีกต่อไปเพื่อประสิทธิภาพการทำงาน วิธีนี้จะไม่มีผลหากยังไม่ได้ซื้อล็อก

โปรดทราบว่าหากทํางานกับสเปรดชีต คุณควรเรียกใช้ SpreadsheetApp.flush() ก่อนปล่อยการล็อกเพื่อบันทึกการเปลี่ยนแปลงทั้งหมดที่รอดําเนินการในสเปรดชีตขณะที่คุณยังมีสิทธิ์เข้าถึงแบบพิเศษ

const lock = LockService.getScriptLock();
lock.waitLock(10000);
// Do some work on a shared resource.
lock.releaseLock();

tryLock(timeoutInMillis)

พยายามขอล็อก โดยระบบจะหมดเวลาหลังจากผ่านไปตามจำนวนมิลลิวินาทีที่ระบุ วิธีนี้จะไม่มีผลหากมีการล็อกไว้แล้ว

const lock = LockService.getScriptLock();
const success = lock.tryLock(10000);
if (!success) {
  Logger.log('Could not obtain lock after 10 seconds.');
}

พารามิเตอร์

ชื่อประเภทคำอธิบาย
timeoutInMillisIntegerระยะเวลาที่รอเพื่อรับการล็อกเป็นมิลลิวินาที

รีเทิร์น

Boolean — จริงหากได้รับสิทธิ์เข้าถึงล็อก มิเช่นนั้นจะเป็นเท็จ


waitLock(timeoutInMillis)

พยายามขอล็อก โดยหมดเวลาพร้อมกับข้อยกเว้นหลังจากผ่านไปตามจำนวนมิลลิวินาทีที่ระบุ เมธอดนี้เหมือนกับ tryLock(timeoutInMillis) ยกเว้นว่าจะแสดงข้อยกเว้นเมื่อรับล็อกไม่ได้แทนที่จะแสดงผลเป็นเท็จ

const lock = LockService.getScriptLock();
try {
  lock.waitLock(10000);
} catch (e) {
  Logger.log('Could not obtain lock after 10 seconds.');
}

พารามิเตอร์

ชื่อประเภทคำอธิบาย
timeoutInMillisIntegerระยะเวลาที่รอเพื่อรับการล็อกเป็นมิลลิวินาที

โยน

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