diff --git a/core/modules/update/update.fetch.inc b/core/modules/update/update.fetch.inc
index 8588832873eb98936d6213366c9ad53ebe314881..1b4e6ca2908dcec02470e8d9851d1da5d08685ff 100644
--- a/core/modules/update/update.fetch.inc
+++ b/core/modules/update/update.fetch.inc
@@ -237,12 +237,22 @@ function _update_create_fetch_task($project) {
   if (empty($fetch_tasks[$cid])) {
     $queue = queue('update_fetch_tasks');
     $queue->createItem($project);
-    db_insert('cache_update')
-      ->fields(array(
-        'cid' => $cid,
-        'created' => REQUEST_TIME,
-      ))
-      ->execute();
+    // Due to race conditions, it is possible that another process already
+    // inserted a row into the {cache_update} table and the following query will
+    // throw an exception.
+    // @todo: Remove the need for the manual check by relying on a queue that
+    // enforces unique items.
+    try {
+      db_insert('cache_update')
+        ->fields(array(
+          'cid' => $cid,
+          'created' => REQUEST_TIME,
+        ))
+        ->execute();
+    }
+    catch (Exception $e) {
+      // The exception can be ignored safely.
+    }
     $fetch_tasks[$cid] = REQUEST_TIME;
   }
 }