diff --git a/core/lib/Drupal/Core/EventSubscriber/MenuRouterRebuildSubscriber.php b/core/lib/Drupal/Core/EventSubscriber/MenuRouterRebuildSubscriber.php
index 521c582..be2ab62 100644
--- a/core/lib/Drupal/Core/EventSubscriber/MenuRouterRebuildSubscriber.php
+++ b/core/lib/Drupal/Core/EventSubscriber/MenuRouterRebuildSubscriber.php
@@ -55,17 +55,8 @@ public function onRouterRebuild(Event $event) {
    */
   protected function menuLinksRebuild() {
     if ($this->lock->acquire(__FUNCTION__)) {
-      $transaction = db_transaction();
-      try {
-        // Ensure the menu links are up to date.
-        $this->menuLinkManager->rebuild();
-        // Ignore any database replicas temporarily.
-        db_ignore_replica();
-      }
-      catch (\Exception $e) {
-        $transaction->rollBack();
-        watchdog_exception('menu', $e);
-      }
+      // Ensure the menu links are up to date.
+      $this->menuLinkManager->rebuild();
 
       $this->lock->release(__FUNCTION__);
     }
diff --git a/core/lib/Drupal/Core/Menu/MenuTreeStorage.php b/core/lib/Drupal/Core/Menu/MenuTreeStorage.php
index 0b11f86..5d4ba6a 100644
--- a/core/lib/Drupal/Core/Menu/MenuTreeStorage.php
+++ b/core/lib/Drupal/Core/Menu/MenuTreeStorage.php
@@ -142,6 +142,17 @@ public function resetDefinitions() {
    * {@inheritdoc}
    */
   public function rebuild(array $definitions) {
+    $transaction = $this->connection->startTransaction();
+    try {
+      // Ignore any database replicas temporarily.
+      db_ignore_replica();
+    }
+    catch (\Exception $e) {
+      if ($transaction) {
+        $transaction->rollback();
+        watchdog_exception('menu', $e);
+      }
+    }
     $links = [];
     $children = [];
     $top_links = [];
