Skip to content

Commit dd4718a

Browse files
committed
Ignore reenlistment of same transaction. Fixes #619
1 parent faa7852 commit dd4718a

File tree

3 files changed

+19
-2
lines changed

3 files changed

+19
-2
lines changed

src/MySqlConnector/Core/ImplicitTransactionBase.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@ internal abstract class ImplicitTransactionBase : IEnlistmentNotification
99
{
1010
public MySqlConnection Connection { get; }
1111

12+
public Transaction Transaction { get; private set; }
13+
1214
public void Start(Transaction transaction)
1315
{
1416
Transaction = transaction;
@@ -42,8 +44,6 @@ void IEnlistmentNotification.Rollback(Enlistment enlistment)
4244

4345
protected ImplicitTransactionBase(MySqlConnection connection) => Connection = connection;
4446

45-
protected Transaction Transaction { get; private set; }
46-
4747
protected abstract void OnStart();
4848
protected abstract void OnPrepare(PreparingEnlistment enlistment);
4949
protected abstract void OnCommit(Enlistment enlistment);

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,10 @@ private async Task<MySqlTransaction> BeginDbTransactionAsync(IsolationLevel isol
8585
#if !NETSTANDARD1_3
8686
public override void EnlistTransaction(System.Transactions.Transaction transaction)
8787
{
88+
// ignore reenlistment of same connection in same transaction
89+
if (m_implicitTransaction?.Transaction.Equals(transaction) ?? false)
90+
return;
91+
8892
if (m_implicitTransaction != null)
8993
throw new MySqlException("Already enlisted in a Transaction.");
9094
if (CurrentTransaction != null)

tests/SideBySide/TransactionScopeTests.cs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,19 @@ public TransactionScopeTests(DatabaseFixture database)
2626
#endif
2727
};
2828

29+
[Theory]
30+
[MemberData(nameof(ConnectionStrings))]
31+
public void EnlistSameTransaction(string connectionString)
32+
{
33+
using (new TransactionScope())
34+
using (var connection = new MySqlConnection(AppConfig.ConnectionString + ";" + connectionString))
35+
{
36+
connection.Open();
37+
connection.EnlistTransaction(System.Transactions.Transaction.Current);
38+
connection.EnlistTransaction(System.Transactions.Transaction.Current);
39+
}
40+
}
41+
2942
[Theory]
3043
[MemberData(nameof(ConnectionStrings))]
3144
public void EnlistTwoTransactions(string connectionString)

0 commit comments

Comments
 (0)