diff --git a/core/core.services.yml b/core/core.services.yml
index 76088786cd..116701c1b4 100644
--- a/core/core.services.yml
+++ b/core/core.services.yml
@@ -192,7 +192,7 @@ services:
       - [setContainer, ['@service_container']]
   cache.backend.database:
     class: Drupal\Core\Cache\DatabaseBackendFactory
-    arguments: ['@database', '@cache_tags.invalidator.checksum']
+    arguments: ['@database.nontransactional', '@cache_tags.invalidator.checksum']
   cache.backend.apcu:
     class: Drupal\Core\Cache\ApcuBackendFactory
     arguments: ['@app.root', '@site.path', '@cache_tags.invalidator.checksum']
@@ -354,6 +354,11 @@ services:
     class: Drupal\Core\Database\Connection
     factory: Drupal\Core\Database\Database::getConnection
     arguments: [default]
+  database.nontransactional:
+    class: Drupal\Core\Database\Connection
+    factory_class: Drupal\Core\Database\Database
+    factory_method: getConnection
+    arguments: [nontransactional]
   datetime.time:
     class: Drupal\Component\Datetime\Time
     arguments: ['@request_stack']
@@ -440,7 +445,7 @@ services:
       - [setContainer, ['@service_container']]
   queue.database:
     class: Drupal\Core\Queue\QueueDatabaseFactory
-    arguments: ['@database']
+    arguments: ['@database.nontransactional']
   path.alias_whitelist:
     class: Drupal\Core\Path\AliasWhitelist
     tags:
@@ -778,13 +783,13 @@ services:
       - { name: plugin_manager_cache_clear }
   lock:
     class: Drupal\Core\Lock\DatabaseLockBackend
-    arguments: ['@database']
+    arguments: ['@database.nontransactional']
     tags:
       - { name: backend_overridable }
     lazy: true
   lock.persistent:
     class: Drupal\Core\Lock\PersistentDatabaseLockBackend
-    arguments: ['@database']
+    arguments: ['@database.nontransactional']
     tags:
       - { name: backend_overridable }
     lazy: true
diff --git a/core/modules/dblog/dblog.services.yml b/core/modules/dblog/dblog.services.yml
index 96ac2ee948..78cac38694 100644
--- a/core/modules/dblog/dblog.services.yml
+++ b/core/modules/dblog/dblog.services.yml
@@ -1,7 +1,7 @@
 services:
   logger.dblog:
     class: Drupal\dblog\Logger\DbLog
-    arguments: ['@database', '@logger.log_message_parser']
+    arguments: ['@database.nontransactional', '@logger.log_message_parser']
     tags:
       - { name: logger }
       - { name: backend_overridable }
diff --git a/core/tests/Drupal/KernelTests/Core/Database/TransactionTest.php b/core/tests/Drupal/KernelTests/Core/Database/TransactionTest.php
index a07045dd53..4575a03ec5 100644
--- a/core/tests/Drupal/KernelTests/Core/Database/TransactionTest.php
+++ b/core/tests/Drupal/KernelTests/Core/Database/TransactionTest.php
@@ -607,4 +607,55 @@ public function testQueryFailureInTransaction() {
     $this->assertEqual('24', $saved_age);
   }
 
+  /**
+   * Test that different connections to not share a transaction.
+   */
+  public function testTransactionMultipleConnections() {
+    \Drupal::database()->truncate('test')->execute();
+    // Setup a secondary database connection.
+    $connection_info = Database::getConnectionInfo('default');
+    Database::addConnectionInfo('default', 'nontransactional', $connection_info['default']);
+
+    /** @var \Drupal\Core\Database\Connection $connection_default */
+    $connection_default = \Drupal::service('database');
+    /** @var \Drupal\Core\Database\Connection $connection_nontransactional */
+    $connection_nontransactional = \Drupal::service('database.nontransactional');
+    // Ensure that the new connection is a different one.
+    $this->assertNotEqual(spl_object_hash($connection_default), spl_object_hash($connection_nontransactional));
+
+    // Open up a transaction in the first connection, add an entry in a table.
+    // Ensure that it can be access in the first connection, but not access in
+    // the non-transactional database connection.
+    $transaction = $connection_default->startTransaction();
+    $connection_default
+      ->insert('test')
+      ->fields(['name' => 'Tim', 'age' => '30'])
+      ->execute();
+    $connection_default
+      ->insert('test')
+      ->fields(['name' => 'Damian', 'age' => '30'])
+      ->execute();
+
+    $this->assertEqual(count($connection_default->select('test')
+      ->fields('test')
+      ->execute()
+      ->fetchAllAssoc('name')), 2);
+    $this->assertEqual(count($connection_nontransactional->select('test')
+      ->fields('test')
+      ->execute()
+      ->fetchAllAssoc('name')), 0);
+
+    // Unset the transaction to commit it.
+    unset($transaction);
+
+    $this->assertEqual(count($connection_default->select('test')
+      ->fields('test')
+      ->execute()
+      ->fetchAllAssoc('name')), 2);
+    $this->assertEqual(count($connection_nontransactional->select('test')
+      ->fields('test')
+      ->execute()
+      ->fetchAllAssoc('name')), 2);
+  }
+
 }
