diff --git a/modules/block/block.module b/modules/block/block.module
index 07718dc1d1402b3f4bb5c4d14c7e8a588d4723d2..07f03eb9d6c6c86e6af9c2f12909e7f2925aabf5 100644
--- a/modules/block/block.module
+++ b/modules/block/block.module
@@ -163,7 +163,7 @@ function _block_rehash() {
     $old_blocks[$old_block->module][$old_block->delta] = $old_block;
   }
 
-  db_query("DELETE FROM {blocks} WHERE theme = '%s'", $theme_key);
+  $blocks = array();
 
   foreach (module_list() as $module) {
     $module_blocks = module_invoke($module, 'block', 'list');
@@ -191,14 +191,21 @@ function _block_rehash() {
           }
         }
 
-        // Reinsert blocks into table
-        db_query("INSERT INTO {blocks} (module, delta, theme, status, weight, region, visibility, pages, custom, throttle) VALUES ('%s', '%s', '%s', %d, %d, '%s', %d, '%s', %d, %d)",
-          $block['module'], $block['delta'], $theme_key, $block['status'], $block['weight'], $block['region'], $block['visibility'], $block['pages'], $block['custom'], $block['throttle']);
         $blocks[] = $block;
       }
     }
   }
 
+  db_lock_table('blocks');
+  // Remove all blocks from table.
+  db_query("DELETE FROM {blocks} WHERE theme = '%s'", $theme_key);
+
+  // Reinsert new set of blocks into table.
+  foreach ($blocks as $block) {
+    db_query("INSERT INTO {blocks} (module, delta, theme, status, weight, region, visibility, pages, custom, throttle) VALUES ('%s', '%s', '%s', %d, %d, '%s', %d, '%s', %d, %d)", $block['module'], $block['delta'], $theme_key, $block['status'], $block['weight'], $block['region'], $block['visibility'], $block['pages'], $block['custom'], $block['throttle']);
+  }
+  db_unlock_tables();
+
   return $blocks;
 }