diff --git a/core/lib/Drupal/Core/Database/Driver/mysql/Transaction.php b/core/lib/Drupal/Core/Database/Driver/mysql/Transaction.php
index a04d7a0..eefb95d 100644
--- a/core/lib/Drupal/Core/Database/Driver/mysql/Transaction.php
+++ b/core/lib/Drupal/Core/Database/Driver/mysql/Transaction.php
@@ -9,4 +9,57 @@
 
 use Drupal\Core\Database\Transaction as DatabaseTransaction;
 
-class Transaction extends DatabaseTransaction { }
+class Transaction extends DatabaseTransaction {
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getTransactionIsolationLevel() {
+    $ret = static::$TRANSACTION_ISOLATION_NONE;
+    $level_string = $this->connection->query("SELECT @@tx_isolation")->fetchField();
+
+    switch ($level_string) {
+      case 'SERIALIZABLE':
+        $ret = static::$TRANSACTION_ISOLATION_SERIALIZABLE;
+        break;
+      case 'REPEATABLE-READ':
+        $ret = static::$TRANSACTION_ISOLATION_REPEATABLEREAD;
+        break;
+      case 'READ-COMMITTED':
+        $ret = static::$TRANSACTION_ISOLATION_READCOMMITTED;
+        break;
+      case 'READ-UNCOMMITTED':
+        $ret = static::$TRANSACTION_ISOLATION_READUNCOMMITTED;
+        break;
+    }
+
+    return $ret;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function setTransactionIsolationLevel($level) {
+    $level_string = '';
+
+    switch ($level) {
+      case static::$TRANSACTION_ISOLATION_SERIALIZABLE:
+        $level_string = 'SERIALIZABLE';
+        break;
+      case static::$TRANSACTION_ISOLATION_REPEATABLEREAD:
+        $level_string = 'REPEATABLE-READ';
+        break;
+      case static::$TRANSACTION_ISOLATION_READCOMMITTED:
+        $level_string = 'READ-COMMITTED';
+        break;
+      case static::$TRANSACTION_ISOLATION_READUNCOMMITTED:
+        $level_string = 'READ-UNCOMMITTED';
+        break;
+      default:
+        throw new \InvalidArgumentException('Invalid transaction isolation level provided.');
+        break;
+    }
+
+    $this->connection->query('SET TRANSACTION ISOLATION LEVEL ' . $level_string);
+  }
+}
diff --git a/core/lib/Drupal/Core/Database/Driver/pgsql/Transaction.php b/core/lib/Drupal/Core/Database/Driver/pgsql/Transaction.php
index 682c53c..274fdb6 100644
--- a/core/lib/Drupal/Core/Database/Driver/pgsql/Transaction.php
+++ b/core/lib/Drupal/Core/Database/Driver/pgsql/Transaction.php
@@ -9,4 +9,56 @@
 
 use Drupal\Core\Database\Transaction as DatabaseTransaction;
 
-class Transaction extends DatabaseTransaction { }
+class Transaction extends DatabaseTransaction {
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getTransactionIsolationLevel() {
+    $ret = static::$TRANSACTION_ISOLATION_NONE;
+    $level_string = $this->conection->query("SELECT current_setting('transaction_isolation')")->fetchField();
+
+    switch ($level_string) {
+      case "SERIALIZABLE":
+        $ret = static::$TRANSACTION_ISOLATION_SERIALIZABLE;
+        break;
+      case "REPEATABLE READ":
+        $ret = static::$TRANSACTION_ISOLATION_REPEATABLEREAD;
+        break;
+      case "READ COMMITTED":
+        $ret = static::$TRANSACTION_ISOLATION_READCOMMITTED;
+        break;
+      case "READ UNCOMMITTED":
+        $ret = static::$TRANSACTION_ISOLATION_READUNCOMMITTED;
+        break;
+    }
+    return $ret;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function setTransactionIsolationLevel($level) {
+    $level_string = '';
+
+    switch ($level) {
+      case static::$TRANSACTION_ISOLATION_SERIALIZABLE:
+        $level_string = 'SERIALIZABLE';
+        break;
+      case static::$TRANSACTION_ISOLATION_REPEATABLEREAD:
+        $level_string = 'REPEATABLE READ';
+        break;
+      case static::$TRANSACTION_ISOLATION_READCOMMITTED:
+        $level_string = 'READ COMMITTED';
+        break;
+      case static::$TRANSACTION_ISOLATION_READUNCOMMITTED:
+        $level_string = 'READ UNCOMMITTED';
+        break;
+      default:
+        throw new \InvalidArgumentException('Invalid transaction isolation level provided.');
+        break;
+    }
+
+    $this->connection->query('SET TRANSACTION ISOLATION LEVEL ' . $level_string);
+  }
+}
diff --git a/core/lib/Drupal/Core/Database/Driver/sqlite/Transaction.php b/core/lib/Drupal/Core/Database/Driver/sqlite/Transaction.php
index 736dbcc..b39979d 100644
--- a/core/lib/Drupal/Core/Database/Driver/sqlite/Transaction.php
+++ b/core/lib/Drupal/Core/Database/Driver/sqlite/Transaction.php
@@ -9,4 +9,32 @@
 
 use Drupal\Core\Database\Transaction as DatabaseTransaction;
 
-class Transaction extends DatabaseTransaction { }
+class Transaction extends DatabaseTransaction {
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getTransactionIsolationLevel() {
+    if ($this->connection->query('PRAGMA read_uncommitted')->fetchField()) {
+      return static::$TRANSACTION_ISOLATION_READUNCOMMITTED;
+    }
+    return static::$TRANSACTION_ISOLATION_SERIALIZABLE;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function setTransactionIsolationLevel($level) {
+    $level_value = 0;
+    // SQLite only supports SERIALIZABLE or READ UNCOMMITTED isolation levels.
+    if (static::$TRANSACTION_ISOLATION_READUNCOMMITTED === $level) {
+      $level_value = 1;
+    }
+    elseif (!in_array($level, $this->getTransactionIsolationLevels())) {
+      throw new \InvalidArgumentException('Invalid transaction isolation level provided.');
+    }
+
+    $this->connection->query('PRAGMA read_uncommitted = :level', array(':level' => $level_value));
+  }
+
+}
diff --git a/core/lib/Drupal/Core/Database/Transaction.php b/core/lib/Drupal/Core/Database/Transaction.php
index eb4e182..c69706e 100644
--- a/core/lib/Drupal/Core/Database/Transaction.php
+++ b/core/lib/Drupal/Core/Database/Transaction.php
@@ -26,7 +26,9 @@
  * directly. Instead, call ->startTransaction(), from the appropriate connection
  * object.
  */
-class Transaction {
+abstract class Transaction {
+
+  use TransactionIsolationTrait;
 
   /**
    * The connection object for this transaction.
@@ -76,6 +78,25 @@ public function __destruct() {
   }
 
   /**
+   * Get the transaction isolation level for the current connection.
+   *
+   * @return int
+   *   An integer to compare isolation level capabilities in a bitwise
+   *   operation.
+   */
+  abstract public function getTransactionIsolationLevel();
+
+  /**
+   * Set the transaction isolation level for the current connection.
+   *
+   * @param int $level
+   *   The transaction isolation level to set for the connection.
+   *
+   * @see \Drupal\Core\Database\TransactionIsolationTrait
+   */
+  abstract public function setTransactionIsolationLevel($level);
+
+  /**
    * Retrieves the name of the transaction or savepoint.
    */
   public function name() {
diff --git a/core/lib/Drupal/Core/Database/TransactionIsolationTrait.php b/core/lib/Drupal/Core/Database/TransactionIsolationTrait.php
new file mode 100644
index 0000000..f4a9680
--- /dev/null
+++ b/core/lib/Drupal/Core/Database/TransactionIsolationTrait.php
@@ -0,0 +1,32 @@
+<?php
+/**
+ * @file
+ * Contains \Drupal\Core\Database\TransactionIsolationTrait.
+ */
+
+namespace Drupal\Core\Database;
+
+trait TransactionIsolationTrait {
+
+  static protected $TRANSACTION_ISOLATION_SERIALIZABLE = 13;
+  static protected $TRANSACTION_ISOLATION_REPEATABLEREAD = 7;
+  static protected $TRANSACTION_ISOLATION_READCOMMITTED = 3;
+  static protected $TRANSACTION_ISOLATION_READUNCOMMITTED = 1;
+  static protected $TRANSACTION_ISOLATION_NONE = 0;
+
+  /**
+   * Get a list of supported transaction isolation levels.
+   *
+   * @return []
+   *   An array of transaction isolation level integers.
+   */
+  protected function getTransactionIsolationLevels() {
+    return [
+      static::$TRANSACTION_ISOLATION_SERIALIZABLE,
+      static::$TRANSACTION_ISOLATION_REPEATABLEREAD,
+      static::$TRANSACTION_ISOLATION_READCOMMITTED,
+      static::$TRANSACTION_ISOLATION_READUNCOMMITTED
+    ];
+  }
+
+}
diff --git a/core/tests/Drupal/KernelTests/Core/Database/TransactionIsolationTest.php b/core/tests/Drupal/KernelTests/Core/Database/TransactionIsolationTest.php
new file mode 100644
index 0000000..a61dfdc
--- /dev/null
+++ b/core/tests/Drupal/KernelTests/Core/Database/TransactionIsolationTest.php
@@ -0,0 +1,78 @@
+<?php
+/**
+ * @file
+ * Provides \Drupal\KernelTests\Database\TransactionIsolationTest.
+ */
+
+namespace Drupal\KernelTests\Core\Database;
+
+use Drupal\Core\Database\Database;
+use Drupal\Core\Database\TransactionIsolationTrait;
+use Drupal\KernelTests\KernelTestBase;
+
+/**
+ * Test setting and getting the transaction isolation level.
+ *
+ * @group Database
+ */
+class TransactionIsolationTest extends KernelTestBase {
+
+  use TransactionIsolationTrait;
+
+  /**
+   * @var \Drupal\Core\Database\Connection
+   *   The database connection.
+   */
+  protected $connection;
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function setUp() {
+    parent::setUp();
+
+    $this->connection = Database::getConnection();
+  }
+
+  /**
+   * Test that transaction isolation levels can be set.
+   */
+  public function testSetIsolationLevel() {
+
+    if ($this->connection->supportsTransactions()) {
+      $transaction = $this->connection->startTransaction();
+
+      // Set the transaction isolation level to READ UNCOMMITTED, which is not
+      // the default for any driver.
+      $transaction->setTransactionIsolationLevel(static::$TRANSACTION_ISOLATION_READUNCOMMITTED);
+      $level = $transaction->getTransactionIsolationLevel();
+
+      // Rollback the transaction.
+      $transaction->rollback();
+
+      // Assert the value returned from the select query before the rollback,
+      // and assert the value after the rollback.
+      $this->assertEquals(static::$TRANSACTION_ISOLATION_READUNCOMMITTED, $level);
+      $this->assertNotEquals(static::$TRANSACTION_ISOLATION_READUNCOMMITTED, $transaction->getTransactionIsolationLevel());
+    }
+    else {
+      $this->markTestSkipped('Transactions are not supported on this database driver.');
+    }
+  }
+
+  /**
+   * Test that an invalid transaction isolation level throws the correct
+   * exception.
+   *
+   * @expectedException \InvalidArgumentException
+   */
+  public function testExpectedException() {
+    if ($this->connection->supportsTransactions()) {
+      $transaction = $this->connection->startTransaction();
+      $transaction->setTransactionIsolationLevel('blue smurf');
+    }
+    else {
+      $this->markTestSkipped('Transactions are not supported on this database driver.');
+    }
+  }
+}
