সাধারণ অর্থে, দ্রুপাল ডিবি সেম্যাফোর সারণীর উদ্দেশ্য কী


9

আমি আইপিসি প্রোগ্রামিংয়ে সেমফোরগুলি উদ্দেশ্যটি বুঝতে পারি তবে আমি এই টেবিলগুলির উদ্দেশ্য হিসাবে কোনও ভাল - বা কোনও - ব্যাখ্যা খুঁজে পাচ্ছি না।

উত্তর:


11

দ্রোপাল থেকে ডিফল্ট রূপে প্রয়োগ করা লকিং মেকানিজম থেকে semaphore টেবিল ব্যবহার করা হয় । প্রোগ্রামিংয়ে দেখা লক করার স্বাভাবিক প্রক্রিয়া থেকে এটি আলাদা নয়: দ্বন্দ্ব বা বর্ণের পরিস্থিতি এড়ানোর জন্য কোনও ক্রিয়াকলাপ ইতিমধ্যে প্রক্রিয়াধীন রয়েছে যাচাই করার জন্য একটি মান ব্যবহৃত হয় । পার্থক্যটি হ'ল, সাধারণত, লকটি একটি ফাইল হয়, যখন দ্রুপাল একটি ডাটাবেসে সারি ব্যবহার করে।

প্রকৃতপক্ষে, লকিং মেকানিজমটির একটি লক ( lock_acquire()) অর্জন করার জন্য ফাংশন রয়েছে , বা একটি লক প্রকাশিত হওয়া অপেক্ষা করুন ( lock_wait())। উভয় ক্ষেত্রেই, সেমফোর ডাটাবেস ব্যবহৃত হয়।

// lock_acquire()
// Optimistically try to acquire the lock, then retry once if it fails.
// The first time through the loop cannot be a retry.
$retry = FALSE;
// We always want to do this code at least once.
do {
  try {
    db_insert('semaphore')
      ->fields(array(
        'name' => $name,
        'value' => _lock_id(),
        'expire' => $expire,
      ))
      ->execute();
    // We track all acquired locks in the global variable.
    $locks[$name] = TRUE;
    // We never need to try again.
    $retry = FALSE;
  }
  catch (PDOException $e) {
    // Suppress the error. If this is our first pass through the loop,
    // then $retry is FALSE. In this case, the insert must have failed
    // meaning some other request acquired the lock but did not release it.
    // We decide whether to retry by checking lock_may_be_available()
    // Since this will break the lock in case it is expired.
    $retry = $retry ? FALSE : lock_may_be_available($name);
  }
  //lock_may_be_available()
  $lock = db_query('SELECT expire, value FROM {semaphore} WHERE name = :name', array(':name' => $name))->fetchAssoc();
  if (!$lock) {
    return TRUE;
  }
  $expire = (float) $lock['expire'];
  $now = microtime(TRUE);
  if ($now > $expire) {
    // We check two conditions to prevent a race condition where another
    // request acquired the lock and set a new expire time. We add a small
    // number to $expire to avoid errors with float to string conversion.
    return (bool) db_delete('semaphore')
      ->condition('name', $name)
      ->condition('value', $lock['value'])
      ->condition('expire', 0.0001 + $expire, '<=')
      ->execute();
  }
  return FALSE;

দ্রুপালে, বিভিন্ন ব্যবহারকারী একই পৃষ্ঠার জন্য অনুরোধ করতে পারে, যার অর্থ বিভিন্ন থ্রেড বা প্রক্রিয়া একই সময়ে একই কোডটি কার্যকর করতে পারে। কোডটি যখন উদাহরণস্বরূপ হয় একটি ডেটাবেস টেবিল আপডেট করার ফলে এটি সমস্যার সৃষ্টি করতে পারে। লক ব্যবহার করা সমস্যা এড়ানোর উপায় is

একটি ডাটাবেস টেবিল যে কারণে ব্যবহৃত হয় তা হ'ল দ্রুপালের কাজ করার জন্য একটি ডাটাবেস ইঞ্জিন প্রয়োজন; লকিং পদ্ধতির জন্য একটি ডাটাবেস টেবিল ব্যবহার করা প্রয়োজনীয়তা হ্রাস করার একটি উপায়। লকিং মেকানিজমটিও APCu এক্সটেনশান ব্যবহার করে প্রয়োগ করা যেতে পারে এবং আমি যদি সঠিকভাবে স্মরণ করি তবে এটি করার একটি মডিউল রয়েছে।


দুর্দান্ত উত্তর। তবে কেবল পরিষ্কার করার জন্য যে সেমফোর টেবিলটি ডিবি ইঞ্জিনের নিজস্ব লকিং প্রক্রিয়া থেকে পৃথক (এটি মাইএসকিএল)।
মাইক

2
সেমফোর টেবিলটি দ্রুপাল তৈরি এবং ব্যবহার করেছে। এটি ডাটাবেস ইঞ্জিন থেকে ব্যবহৃত হয় না।
কিমলালুনো

6

@ কিমলালানো থেকে উত্তর সম্পূর্ণ এবং নিখুঁত। তবে, আমি মনে করি এটি ড্রুপালের সেমোফোরগুলি ব্যবহার করে ডিবি লকিংয়ের ধারণা / ব্যবহারটি (উজ্জ্বলভাবে) ব্যাখ্যা করার উপর জোর দেয়।

আমি পরিবর্তে ওপি'র কাছাকাছি আসতে চাই:

সেমফোর টেবিলের উদ্দেশ্য (সেমফোর টেবিল তৈরির বর্ণনায় বর্ণিত):

সেমফোরস, তালা, পতাকা ইত্যাদির জন্য টেবিল যা ড্রুপাল ভেরিয়েবল হিসাবে সংরক্ষণ করা যায় না কারণ সেগুলি অবশ্যই ক্যাশে করা উচিত নয়।

সুতরাং, এই টেবিলটির উদ্দেশ্য কেবলমাত্র ডিবি লকিং মেকানিজমের চেয়ে বেশি (এখন পর্যন্ত আমি সেই মন্তব্যটি থেকে বুঝতে পারি), এবং এটি ভেরিয়েবলের ক্যাচিং এড়ানোর প্রযুক্তিগত প্রয়োজনকেও সম্বোধন করে।

নোট: আমি যদি এই ভুলটি পেয়ে থাকি তবে এই বিষয়ে আরও দক্ষতার সাথে কেউ সংশোধন করে খুশি হবেন। চিয়ার্স!

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.