diff --git a/core/includes/database.inc b/core/includes/database.inc
index 0197377..dda50ba 100644
--- a/core/includes/database.inc
+++ b/core/includes/database.inc
@@ -359,6 +359,16 @@ function db_delete($table, array $options = array()) {
 /**
  * Returns a new TruncateQuery object for the active database.
  *
+ * Warning: Truncating a large database table may cause it to be unavailable
+ * for reading and/or writing for a period.
+ *
+ * Truncation of tables may not be in a transaction as it isn't possible to 
+ * rollback and the changes are visible to other connections and transactions.
+ *
+ * Consider using other data structures and a scoped deletion/merge rather than
+ * this function to experience less locking. The exact impact will vary per
+ * database driver type and version.
+ *
  * @param $table
  *   The table from which to delete.
  * @param $options
diff --git a/core/lib/Drupal/Core/Database/Query/Truncate.php b/core/lib/Drupal/Core/Database/Query/Truncate.php
index 857e199..3a3144e 100644
--- a/core/lib/Drupal/Core/Database/Query/Truncate.php
+++ b/core/lib/Drupal/Core/Database/Query/Truncate.php
@@ -60,6 +60,11 @@ public function compiled() {
    *   Return value is dependent on the database type.
    */
   public function execute() {
+    if ($this->connection->inTransaction()) {
+      watchdog('Database',
+       'Truncating a database table (%table) in a transaction cannot be rolled back and is visible outside the transaction. As the module maintainer to re-implement this',
+       array('%table' => $this->table, WATCHDOG_WARNING);
+    }
     return $this->connection->query((string) $this, array(), $this->queryOptions);
   }
 
