diff --git a/internal/sqladapter/database.go b/internal/sqladapter/database.go
index 0d4ec96b8546e03b2daa62730ca092c23e00ec11..27cf5b3f7d190da140091e817ca72416e7bf4ef4 100644
--- a/internal/sqladapter/database.go
+++ b/internal/sqladapter/database.go
@@ -180,15 +180,21 @@ func (d *database) Close() error {
 		d.sessMu.Unlock()
 	}()
 	if d.sess != nil {
-		if d.Transaction() != nil && !d.Transaction().Committed() {
-			d.Transaction().Rollback()
+		if cleaner, ok := d.PartialDatabase.(HasCleanUp); ok {
+			cleaner.CleanUp()
 		}
 		d.cachedCollections.Clear()
 		d.cachedStatements.Clear() // Closes prepared statements as well.
-		if cleaner, ok := d.PartialDatabase.(HasCleanUp); ok {
-			cleaner.CleanUp()
+
+		tx := d.Transaction()
+		if tx == nil {
+			// Not within a transaction.
+			return d.sess.Close()
+		}
+
+		if !tx.Committed() {
+			tx.Rollback()
 		}
-		return d.sess.Close()
 	}
 	return nil
 }
diff --git a/mysql/database.go b/mysql/database.go
index c660f14d199f693538678e6404558eb28a78ab95..8263e40cba12122916ffc1240fff4e6b29e801d4 100644
--- a/mysql/database.go
+++ b/mysql/database.go
@@ -133,10 +133,15 @@ func (d *database) clone() (*database, error) {
 		return nil, err
 	}
 
-	if err := clone.open(); err != nil {
+	clone.BaseDatabase = sqladapter.NewBaseDatabase(clone)
+
+	b, err := sqlbuilder.WithSession(clone.BaseDatabase, template)
+	if err != nil {
 		return nil, err
 	}
+	clone.Builder = b
 
+	clone.BaseDatabase.BindSession(d.BaseDatabase.Session())
 	return clone, nil
 }
 
diff --git a/postgresql/database.go b/postgresql/database.go
index 0933942e6785d5ca0388c92d8ecd608fc5772181..d7807d99b3e70762d2915ad6a4bf282ce04d8f0a 100644
--- a/postgresql/database.go
+++ b/postgresql/database.go
@@ -132,10 +132,15 @@ func (d *database) clone() (*database, error) {
 		return nil, err
 	}
 
-	if err := clone.open(); err != nil {
+	clone.BaseDatabase = sqladapter.NewBaseDatabase(clone)
+
+	b, err := sqlbuilder.WithSession(clone.BaseDatabase, template)
+	if err != nil {
 		return nil, err
 	}
+	clone.Builder = b
 
+	clone.BaseDatabase.BindSession(d.BaseDatabase.Session())
 	return clone, nil
 }