Skip to content

Commit 09d48fa

Browse files
committed
Implement AutoEnlist connection string option.
1 parent 0d3753f commit 09d48fa

File tree

5 files changed

+94
-26
lines changed

5 files changed

+94
-26
lines changed

src/MySqlConnector/MySqlClient/MySqlConnection.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -161,7 +161,7 @@ private async Task OpenAsync(IOBehavior ioBehavior, CancellationToken cancellati
161161
}
162162

163163
#if !NETSTANDARD1_3
164-
if (System.Transactions.Transaction.Current != null)
164+
if (m_connectionSettings.AutoEnlist && System.Transactions.Transaction.Current != null)
165165
EnlistTransaction(System.Transactions.Transaction.Current);
166166
#endif
167167
}

src/MySqlConnector/MySqlClient/MySqlConnectionStringBuilder.cs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,12 @@ public bool AllowUserVariables
110110
set => MySqlConnectionStringOption.AllowUserVariables.SetValue(this, value);
111111
}
112112

113+
public bool AutoEnlist
114+
{
115+
get => MySqlConnectionStringOption.AutoEnlist.GetValue(this);
116+
set => MySqlConnectionStringOption.AutoEnlist.SetValue(this, value);
117+
}
118+
113119
public bool BufferResultSets
114120
{
115121
get => MySqlConnectionStringOption.BufferResultSets.GetValue(this);
@@ -243,6 +249,7 @@ internal abstract class MySqlConnectionStringOption
243249

244250
// Other Options
245251
public static readonly MySqlConnectionStringOption<bool> AllowUserVariables;
252+
public static readonly MySqlConnectionStringOption<bool> AutoEnlist;
246253
public static readonly MySqlConnectionStringOption<bool> BufferResultSets;
247254
public static readonly MySqlConnectionStringOption<string> CharacterSet;
248255
public static readonly MySqlConnectionStringOption<uint> ConnectionTimeout;
@@ -345,6 +352,10 @@ static MySqlConnectionStringOption()
345352
keys: new[] { "AllowUserVariables", "Allow User Variables" },
346353
defaultValue: false));
347354

355+
AddOption(AutoEnlist = new MySqlConnectionStringOption<bool>(
356+
keys: new[] { "AutoEnlist", "Auto Enlist" },
357+
defaultValue: true));
358+
348359
AddOption(BufferResultSets = new MySqlConnectionStringOption<bool>(
349360
keys: new[] { "BufferResultSets", "Buffer Result Sets" },
350361
defaultValue: false));

src/MySqlConnector/Serialization/ConnectionSettings.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ public ConnectionSettings(MySqlConnectionStringBuilder csb)
4646

4747
// Other Options
4848
AllowUserVariables = csb.AllowUserVariables;
49+
AutoEnlist = csb.AutoEnlist;
4950
BufferResultSets = csb.BufferResultSets;
5051
ConnectionTimeout = (int)csb.ConnectionTimeout;
5152
ConvertZeroDateTime = csb.ConvertZeroDateTime;
@@ -87,6 +88,7 @@ private ConnectionSettings(ConnectionSettings other, bool? useCompression)
8788

8889
// Other Options
8990
AllowUserVariables = other.AllowUserVariables;
91+
AutoEnlist = other.AutoEnlist;
9092
BufferResultSets = other.BufferResultSets;
9193
ConnectionTimeout = other.ConnectionTimeout;
9294
ConvertZeroDateTime = other.ConvertZeroDateTime;
@@ -124,6 +126,7 @@ private ConnectionSettings(ConnectionSettings other, bool? useCompression)
124126

125127
// Other Options
126128
internal readonly bool AllowUserVariables;
129+
internal readonly bool AutoEnlist;
127130
internal readonly bool BufferResultSets;
128131
internal readonly int ConnectionTimeout;
129132
internal readonly bool ConvertZeroDateTime;

tests/MySqlConnector.Tests/MySqlConnectionStringBuilderTests.cs

Lines changed: 28 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ public void Defaults()
1111
{
1212
var csb = new MySqlConnectionStringBuilder();
1313
Assert.Equal(false, csb.AllowUserVariables);
14+
Assert.Equal(true, csb.AutoEnlist);
1415
Assert.Equal(null, csb.CertificateFile);
1516
Assert.Equal(null, csb.CertificatePassword);
1617
Assert.Equal("", csb.CharacterSet);
@@ -54,35 +55,37 @@ public void ParseConnectionString()
5455
var csb = new MySqlConnectionStringBuilder
5556
{
5657
ConnectionString = "Data Source=db-server;" +
57-
"Initial Catalog=schema_name;" +
58-
"Allow User Variables=true;" +
59-
"certificate file=file.pfx;" +
60-
"certificate password=Pass1234;" +
61-
"Character Set=latin1;" +
62-
"Compress=true;" +
63-
"connect timeout=30;" +
64-
"connection lifetime=15;" +
65-
"ConnectionReset=false;" +
66-
"Convert Zero Datetime=true;" +
58+
"Initial Catalog=schema_name;" +
59+
"Allow User Variables=true;" +
60+
"auto enlist=False;" +
61+
"certificate file=file.pfx;" +
62+
"certificate password=Pass1234;" +
63+
"Character Set=latin1;" +
64+
"Compress=true;" +
65+
"connect timeout=30;" +
66+
"connection lifetime=15;" +
67+
"ConnectionReset=false;" +
68+
"Convert Zero Datetime=true;" +
6769
#if !BASELINE
68-
"connectionidletimeout=30;" +
69-
"bufferresultsets=true;" +
70-
"forcesynchronous=true;" +
70+
"connectionidletimeout=30;" +
71+
"bufferresultsets=true;" +
72+
"forcesynchronous=true;" +
7173
#endif
72-
"Keep Alive=90;" +
73-
"minpoolsize=5;" +
74-
"maxpoolsize=15;" +
75-
"OldGuids=true;" +
76-
"persistsecurityinfo=yes;" +
77-
"Pooling=no;" +
78-
"Port=1234;" +
79-
"pwd=Pass1234;" +
80-
"Treat Tiny As Boolean=false;" +
81-
"ssl mode=verifyca;" +
82-
"Uid=username;" +
83-
"useaffectedrows=false"
74+
"Keep Alive=90;" +
75+
"minpoolsize=5;" +
76+
"maxpoolsize=15;" +
77+
"OldGuids=true;" +
78+
"persistsecurityinfo=yes;" +
79+
"Pooling=no;" +
80+
"Port=1234;" +
81+
"pwd=Pass1234;" +
82+
"Treat Tiny As Boolean=false;" +
83+
"ssl mode=verifyca;" +
84+
"Uid=username;" +
85+
"useaffectedrows=false"
8486
};
8587
Assert.Equal(true, csb.AllowUserVariables);
88+
Assert.Equal(false, csb.AutoEnlist);
8689
Assert.Equal("file.pfx", csb.CertificateFile);
8790
Assert.Equal("Pass1234", csb.CertificatePassword);
8891
Assert.Equal("latin1", csb.CharacterSet);

tests/SideBySide/TransactionScopeTests.cs

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -195,6 +195,57 @@ public void ThrowExceptionAfterCompleteInTransaction()
195195
Assert.Equal(new[] { 1, 2 }, values);
196196
}
197197

198+
[Fact]
199+
public void AutoEnlistFalseWithCommit()
200+
{
201+
m_database.Connection.Execute(@"drop table if exists transaction_scope_test;
202+
create table transaction_scope_test(value integer not null);");
203+
204+
using (var transactionScope = new TransactionScope())
205+
using (var conn = new MySqlConnection(AppConfig.ConnectionString + ";auto enlist=false"))
206+
{
207+
conn.Open();
208+
using (var dbTransaction = conn.BeginTransaction())
209+
{
210+
conn.Execute("insert into transaction_scope_test(value) values(1), (2);");
211+
212+
dbTransaction.Commit();
213+
transactionScope.Complete();
214+
}
215+
}
216+
217+
var values = m_database.Connection.Query<int>(@"select value from transaction_scope_test order by value;").ToList();
218+
Assert.Equal(new[] { 1, 2 }, values);
219+
}
220+
221+
[Fact]
222+
public void AutoEnlistFalseWithoutCommit()
223+
{
224+
m_database.Connection.Execute(@"drop table if exists transaction_scope_test;
225+
create table transaction_scope_test(value integer not null);");
226+
227+
using (var transactionScope = new TransactionScope())
228+
using (var conn = new MySqlConnection(AppConfig.ConnectionString + ";auto enlist=false"))
229+
{
230+
conn.Open();
231+
using (var dbTransaction = conn.BeginTransaction())
232+
{
233+
conn.Execute("insert into transaction_scope_test(value) values(1), (2);");
234+
235+
#if BASELINE
236+
// With Connector/NET a MySqlTransaction can't roll back after TransactionScope has been completed;
237+
// workaround is to explicitly dispose it first. In MySqlConnector (with AutoEnlist=false) they have
238+
// independent lifetimes.
239+
dbTransaction.Dispose();
240+
#endif
241+
transactionScope.Complete();
242+
}
243+
}
244+
245+
var values = m_database.Connection.Query<int>(@"select value from transaction_scope_test order by value;").ToList();
246+
Assert.Equal(new int[0], values);
247+
}
248+
198249
[Fact
199250
#if BASELINE
200251
(Skip = "Multiple simultaneous connections or connections with different connection strings inside the same transaction are not currently supported.")

0 commit comments

Comments
 (0)