Class Lock

تنظيم صفحاتك في مجموعات يمكنك حفظ المحتوى وتصنيفه حسب إعداداتك المفضّلة.
القفل

تمثيل لقفل الاستبعاد المتبادل.

تسمح هذه الفئة للنص البرمجي بالتأكّد من أنّ مثيلاً واحدًا فقط من النص البرمجي ينفّذ قسمًا معيّنًا من الرمز في كل مرة. ويُعدّ هذا مفيدًا على وجه الخصوص لعمليات معاودة الاتصال والمشغّلات، حيث قد يؤدي إجراء المستخدم إلى إجراء تغييرات على مورد مشترك وتريد التأكّد من عدم حدوث تعارضات.

توضّح الأمثلة التالية كيفية استخدام قفل في معالج إرسال النموذج.

// Generates a unique ticket number for every form submission.
function onFormSubmit(e) {
  var targetCell = e.range.offset(0, e.range.getNumColumns(), 1, 1);

  // Get a script lock, because we're about to modify a shared resource.
  var lock = LockService.getScriptLock();
  // Wait for up to 30 seconds for other processes to finish.
  lock.waitLock(30000);

  var ticketNumber = Number(ScriptProperties.getProperty('lastTicketNumber')) + 1;
  ScriptProperties.setProperty('lastTicketNumber', ticketNumber);

  // Release the lock so that other processes can continue.
  lock.releaseLock();

  targetCell.setValue(ticketNumber);
}
بدون خدمة LockService، إذا أرسل مستخدمَين النموذج في الوقت نفسه تقريبًا، قد تنتهي أرقام الهواتف في مكان واحد، حيث يمكن أن تتغير السمة 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()

ارفع القفل، مع السماح بالعمليات الأخرى التي تنتظر قفل القفل. يتم فتح قفل القفل تلقائيًا عند إنهاء النص البرمجي، ولكن للحفاظ على الكفاءة، من الأفضل تحريره فور الحاجة إلى الوصول الحصري إلى قسم من الرمز. لن يكون لهذه الطريقة أي تأثير في حال عدم الحصول على القفل.

وتجدر الإشارة إلى أنه إذا كنت تستخدم جدول بيانات، يجب استدعاء SheetsApp.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.');
}

المعلّمات

الاسمالنوعالوصف
timeoutInMillisIntegerالمدة التي تنتظر خلالها لاكتساب القفل، بالمللي ثانية

تذكرة ذهاب وعودة

Boolean - صحيح إذا تم اكتساب القفل، أو خطأ إذا لم يكن مُكتسبًا


waitLock(timeoutInMillis)

محاولة الحصول على القفل، وتنتهي المهلة باستثناء بعد عدد الثواني بالمللي ثانية. هذه الطريقة هي نفسها للطريقة tryLock(timeoutInMillis) باستثناء أنها تعرض استثناءً عندما يتعذّر الحصول على القفل بدلاً من عرض خطأ.

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

المعلّمات

الاسمالنوعالوصف
timeoutInMillisIntegerالمدة التي تنتظر خلالها لاكتساب القفل، بالمللي ثانية

طرح

Error: في حال انتهت مهلة الطريقة قبل اكتساب القفل