=== modified file 'sites/all/modules/job_queue/job_queue.install'
--- sites/all/modules/job_queue/job_queue.install	2008-01-10 05:58:11 +0000
+++ sites/all/modules/job_queue/job_queue.install	2008-01-10 05:58:54 +0000
@@ -12,6 +12,7 @@
         arguments text NOT NULL,
         file varchar(255) NOT NULL,
         queue int NOT NULL DEFAULT 0,
+        locked int NOT NULL DEFAULT 0,
         PRIMARY KEY (jqid),
         KEY(queue)
       )');
@@ -53,3 +54,17 @@
 
   return $return;
 }
+
+
+function job_queue_update_3() {
+  $return = array();
+
+  switch ($GLOBALS['db_type']) {
+    case 'mysql':
+    case 'mysqli':
+      $return[] = update_sql('ALTER TABLE {job_queue} ADD locked int NOT NULL DEFAULT 0');
+      break;
+  }
+
+  return $return;
+}

=== modified file 'sites/all/modules/job_queue/job_queue.module'
--- sites/all/modules/job_queue/job_queue.module	2008-01-10 05:58:11 +0000
+++ sites/all/modules/job_queue/job_queue.module	2008-01-10 05:58:54 +0000
@@ -53,15 +53,24 @@
 /**
  * Dequeue and execute a queued job. Actions are logged via watchdog().
  *
+ * @param $queue Optional numeric queue identifer.
+ * @param $locked Optional numeric lock identifer, used to identify dequeue caller.
+ *
  * @return TRUE if a job was dequeued, reguardless of success or failure
  *   executing. FALSE if the queue was empty.
  */
-function job_queue_dequeue($queue = 0) {
-  $result = db_query_range('SELECT jqid, description, function, arguments, file FROM {job_queue} WHERE queue = %d ORDER BY jqid', $queue,  0, 1);
+function job_queue_dequeue($queue = 0, $locked = 1) {
+  // Prevent multiple callers from getting the same job.
+  db_lock_table('job_queue');
+  $result = db_query_range('SELECT jqid, description, function, arguments, file FROM {job_queue} WHERE queue = %d AND locked = 0 ORDER BY jqid', $queue,  0, 1);
   if (db_num_rows($result) ==  0) {
+    db_unlock_tables();
     return FALSE;   
   }
   $job = db_fetch_object($result);
+  // Mark the job as locked and releaste the table lock. 
+  db_query('UPDATE {job_queue} SET locked = %d WHERE jqid = %d', $locked, $job->jqid);
+  db_unlock_tables();
   if (!empty($job->file)) {
     include_once $job->file;
   }

