Class Lock

ล็อก

การแสดงการล็อกแบบ Mutex

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

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

// 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แสดง true หากได้รับล็อก
releaseLock()voidปล่อยการล็อกเพื่อให้กระบวนการอื่นๆ ที่รอการล็อกดำเนินการต่อได้
tryLock(timeoutInMillis)Booleanพยายามรับล็อก โดยจะหมดเวลาหลังจากผ่านไปตามจำนวนมิลลิวินาทีที่ระบุ
waitLock(timeoutInMillis)voidพยายามรับการล็อก โดยจะหมดเวลาพร้อมข้อยกเว้นหลังจากผ่านไปตามจำนวนมิลลิวินาทีที่ระบุ

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

hasLock()

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

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

รีเทิร์น

Booleantrue หากได้รับล็อก หรือ false ในกรณีอื่นๆ


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ระยะเวลาในการรอเพื่อรับล็อกเป็นมิลลิวินาที

รีเทิร์น

Booleantrue หากได้รับล็อก หรือ false ในกรณีอื่นๆ


waitLock(timeoutInMillis)

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

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

พารามิเตอร์

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

ส่ง

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