Skip to content

Commit 7caf5eb

Browse files
committed
Don't close active transaction in ChangeDatabase. Fixes #794
1 parent 578c993 commit 7caf5eb

File tree

2 files changed

+42
-2
lines changed

2 files changed

+42
-2
lines changed

src/MySqlConnector/MySql.Data.MySqlClient/MySqlConnection.cs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -246,8 +246,6 @@ private async Task ChangeDatabaseAsync(IOBehavior ioBehavior, string databaseNam
246246
if (State != ConnectionState.Open)
247247
throw new InvalidOperationException("Connection is not open.");
248248

249-
await CloseDatabaseAsync(ioBehavior, cancellationToken).ConfigureAwait(false);
250-
251249
using (var initDatabasePayload = InitDatabasePayload.Create(databaseName))
252250
await m_session!.SendAsync(initDatabasePayload, ioBehavior, cancellationToken).ConfigureAwait(false);
253251
var payload = await m_session.ReceiveReplyAsync(ioBehavior, cancellationToken).ConfigureAwait(false);

tests/SideBySide/ConnectSync.cs

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
using System;
22
using System.Data;
33
using System.Diagnostics;
4+
using System.Linq;
45
using System.Text.RegularExpressions;
6+
using Dapper;
57
using MySql.Data.MySqlClient;
68
using Xunit;
79

@@ -342,6 +344,46 @@ public void UseDatabase()
342344
Assert.Equal(AppConfig.SecondaryDatabase, QueryCurrentDatabase(connection));
343345
}
344346

347+
[SkippableFact(ConfigSettings.SecondaryDatabase)]
348+
public void ChangeDatabaseInTransaction()
349+
{
350+
var csb = AppConfig.CreateConnectionStringBuilder();
351+
using var connection = new MySqlConnection(csb.ConnectionString);
352+
connection.Open();
353+
connection.Execute($@"drop table if exists changedb1;
354+
create table changedb1(value int not null);
355+
drop table if exists `{AppConfig.SecondaryDatabase}`.changedb2;
356+
create table `{AppConfig.SecondaryDatabase}`.changedb2(value int not null);");
357+
358+
using var transaction = connection.BeginTransaction();
359+
360+
#if !BASELINE
361+
Assert.Equal(transaction, connection.CurrentTransaction);
362+
#endif
363+
using (var command = new MySqlCommand("SELECT 'abc';", connection, transaction))
364+
Assert.Equal("abc", command.ExecuteScalar());
365+
using (var command = new MySqlCommand("INSERT INTO changedb1(value) values(1),(2);", connection, transaction))
366+
command.ExecuteNonQuery();
367+
368+
connection.ChangeDatabase(AppConfig.SecondaryDatabase);
369+
370+
#if !BASELINE
371+
Assert.Equal(transaction, connection.CurrentTransaction);
372+
#endif
373+
374+
using (var command = new MySqlCommand("SELECT 'abc';", connection, transaction))
375+
Assert.Equal("abc", command.ExecuteScalar());
376+
using (var command = new MySqlCommand("INSERT INTO changedb2(value) values(3),(4);", connection, transaction))
377+
command.ExecuteNonQuery();
378+
379+
transaction.Commit();
380+
381+
using var connection2 = new MySqlConnection(csb.ConnectionString);
382+
connection2.Open();
383+
var values = connection2.Query<int>($@"SELECT value FROM changedb1 UNION SELECT value FROM `{AppConfig.SecondaryDatabase}`.changedb2", connection2).OrderBy(x => x).ToList();
384+
Assert.Equal(new[] { 1, 2, 3, 4 }, values);
385+
}
386+
345387
private static string QueryCurrentDatabase(MySqlConnection connection)
346388
{
347389
using var cmd = connection.CreateCommand();

0 commit comments

Comments
 (0)