Secara umum, apa tujuan dari Tabel Semaphore DB Drupal


9

Saya mengerti tujuan semaphores dalam pemrograman IPC tapi saya tidak menemukan penjelasan yang baik - atau apa pun - untuk tujuan tabel ini.

Jawaban:


11

Tabel semaphore digunakan dari mekanisme penguncian yang diterapkan secara default dari Drupal. Ini tidak berbeda dari mekanisme penguncian yang biasa terlihat dalam pemrograman: Nilai digunakan untuk memverifikasi operasi yang sedang berlangsung, untuk menghindari konflik atau kondisi balapan. Perbedaannya adalah bahwa, biasanya, kuncinya adalah file, sementara Drupal menggunakan baris dalam database.

Bahkan, mekanisme penguncian memiliki fungsi untuk memperoleh kunci ( lock_acquire()), atau menunggu kunci dilepaskan ( lock_wait()). Dalam kedua kasus tersebut, basis data semaphore digunakan.

// 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;

Di Drupal, pengguna yang berbeda dapat meminta halaman yang sama, yang berarti utas atau proses yang berbeda dapat mengeksekusi kode yang sama pada saat yang sama. Ini dapat menyebabkan masalah ketika kode, misalnya, memperbarui tabel database. Menggunakan kunci adalah cara untuk menghindari hal ini dapat menyebabkan masalah.

Alasan tabel database digunakan adalah karena Drupal membutuhkan mesin database untuk bekerja; menggunakan tabel database juga untuk mekanisme penguncian adalah cara untuk mengurangi persyaratan. Mekanisme penguncian dapat diimplementasikan menggunakan ekstensi APCu juga, dan jika saya ingat dengan benar, ada modul yang melakukan hal itu.


Jawaban yang sangat bagus. Tetapi hanya untuk memperjelas tabel semaphore terpisah dari mekanisme penguncian asli di mesin DB itu sendiri (misalnya mysql).
Mike

2
Tabel semaphore dibuat dan digunakan oleh Drupal. Itu tidak digunakan dari mesin database.
kiamlaluno

6

Jawaban dari @kiamlaluno lengkap dan sempurna. Tapi, saya pikir itu berfokus pada menjelaskan (cemerlang) konsep / penggunaan penguncian db menggunakan semaphore drupal.

Pada gilirannya saya berani mendekati OP:

Tujuan dari tabel semaphore adalah (seperti yang dijelaskan dalam deskripsi pembuatan tabel semaphore):

Tabel untuk memegang semaphore, kunci, bendera, dll. Yang tidak dapat disimpan sebagai variabel Drupal karena mereka tidak boleh di-cache.

Jadi, tujuan tabel itu lebih dari sekedar mekanisme penguncian db (sejauh ini saya bisa mengerti dari komentar itu), dan juga membahas persyaratan teknis untuk menghindari caching variabel.

NB: Dengan senang hati akan dikoreksi oleh seseorang dengan keahlian lebih pada topik ini jika saya salah. Bersulang!

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.