Skip to content

Commit

Permalink
Change return type of BeginTransactionAsync. Fixes #642
Browse files Browse the repository at this point in the history
This matches the proposed new .NET Core 3.0 API.

Add missing .NET Core 3.0 async override.
  • Loading branch information
bgrainger committed Jun 29, 2019
1 parent 18b3f22 commit 4ba6da3
Show file tree
Hide file tree
Showing 2 changed files with 71 additions and 7 deletions.
17 changes: 10 additions & 7 deletions src/MySqlConnector/MySql.Data.MySqlClient/MySqlConnection.cs
Original file line number Diff line number Diff line change
Expand Up @@ -31,20 +31,23 @@ public MySqlConnection(string connectionString)
public new MySqlTransaction BeginTransaction(IsolationLevel isolationLevel) => (MySqlTransaction) base.BeginTransaction(isolationLevel);
protected override DbTransaction BeginDbTransaction(IsolationLevel isolationLevel) => BeginDbTransactionAsync(isolationLevel, IOBehavior.Synchronous, CancellationToken.None).GetAwaiter().GetResult();

public Task<MySqlTransaction> BeginTransactionAsync() => BeginDbTransactionAsync(IsolationLevel.Unspecified, AsyncIOBehavior, CancellationToken.None);
public ValueTask<MySqlTransaction> BeginTransactionAsync() => BeginDbTransactionAsync(IsolationLevel.Unspecified, AsyncIOBehavior, CancellationToken.None);
#if !NETCOREAPP3_0
public Task<MySqlTransaction> BeginTransactionAsync(CancellationToken cancellationToken) => BeginDbTransactionAsync(IsolationLevel.Unspecified, AsyncIOBehavior, cancellationToken);
public ValueTask<MySqlTransaction> BeginTransactionAsync(CancellationToken cancellationToken) => BeginDbTransactionAsync(IsolationLevel.Unspecified, AsyncIOBehavior, cancellationToken);
#else
public new Task<MySqlTransaction> BeginTransactionAsync(CancellationToken cancellationToken) => BeginDbTransactionAsync(IsolationLevel.Unspecified, AsyncIOBehavior, cancellationToken);
public new ValueTask<MySqlTransaction> BeginTransactionAsync(CancellationToken cancellationToken) => BeginDbTransactionAsync(IsolationLevel.Unspecified, AsyncIOBehavior, cancellationToken);
#endif
public Task<MySqlTransaction> BeginTransactionAsync(IsolationLevel isolationLevel) => BeginDbTransactionAsync(isolationLevel, AsyncIOBehavior, CancellationToken.None);
public ValueTask<MySqlTransaction> BeginTransactionAsync(IsolationLevel isolationLevel) => BeginDbTransactionAsync(isolationLevel, AsyncIOBehavior, CancellationToken.None);
#if !NETCOREAPP3_0
public Task<MySqlTransaction> BeginTransactionAsync(IsolationLevel isolationLevel, CancellationToken cancellationToken) => BeginDbTransactionAsync(isolationLevel, AsyncIOBehavior, cancellationToken);
public ValueTask<MySqlTransaction> BeginTransactionAsync(IsolationLevel isolationLevel, CancellationToken cancellationToken) => BeginDbTransactionAsync(isolationLevel, AsyncIOBehavior, cancellationToken);
#else
public new Task<MySqlTransaction> BeginTransactionAsync(IsolationLevel isolationLevel, CancellationToken cancellationToken) => BeginDbTransactionAsync(isolationLevel, AsyncIOBehavior, cancellationToken);
public new ValueTask<MySqlTransaction> BeginTransactionAsync(IsolationLevel isolationLevel, CancellationToken cancellationToken) => BeginDbTransactionAsync(isolationLevel, AsyncIOBehavior, cancellationToken);

protected override async ValueTask<DbTransaction> BeginDbTransactionAsync(IsolationLevel isolationLevel, CancellationToken cancellationToken) =>
await BeginDbTransactionAsync(isolationLevel, AsyncIOBehavior, cancellationToken).ConfigureAwait(false);
#endif

private async Task<MySqlTransaction> BeginDbTransactionAsync(IsolationLevel isolationLevel, IOBehavior ioBehavior, CancellationToken cancellationToken)
private async ValueTask<MySqlTransaction> BeginDbTransactionAsync(IsolationLevel isolationLevel, IOBehavior ioBehavior, CancellationToken cancellationToken)
{
if (State != ConnectionState.Open)
throw new InvalidOperationException("Connection is not open.");
Expand Down
61 changes: 61 additions & 0 deletions tests/SideBySide/Transaction.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
using System;
using System.Data.Common;
using System.Threading.Tasks;
using Dapper;
using MySql.Data.MySqlClient;
Expand Down Expand Up @@ -36,6 +37,20 @@ public void Commit()
Assert.Equal(new[] { 1, 2 }, results);
}

[Fact]
public void DbConnectionCommit()
{
DbConnection connection = m_connection;
connection.Execute("delete from transactions_test");
using (var trans = connection.BeginTransaction())
{
connection.Execute("insert into transactions_test values(1), (2)", transaction: trans);
trans.Commit();
}
var results = connection.Query<int>(@"select value from transactions_test order by value;");
Assert.Equal(new[] { 1, 2 }, results);
}

#if !BASELINE
[Fact]
public async Task CommitAsync()
Expand Down Expand Up @@ -68,6 +83,22 @@ public async Task CommitDisposeAsync()
var results = await m_connection.QueryAsync<int>(@"select value from transactions_test order by value;").ConfigureAwait(false);
Assert.Equal(new[] { 1, 2 }, results);
}

#if !NET452 && !NET461 && !NET472 && !NETCOREAPP1_1_2 && !NETCOREAPP2_0 && !NETCOREAPP2_1
[Fact]
public async Task DbConnectionCommitAsync()
{
DbConnection connection = m_connection;
await connection.ExecuteAsync("delete from transactions_test").ConfigureAwait(false);
using (var trans = await connection.BeginTransactionAsync().ConfigureAwait(false))
{
await connection.ExecuteAsync("insert into transactions_test values(1), (2)", transaction: trans).ConfigureAwait(false);
await trans.CommitAsync().ConfigureAwait(false);
}
var results = await connection.QueryAsync<int>(@"select value from transactions_test order by value;").ConfigureAwait(false);
Assert.Equal(new[] { 1, 2 }, results);
}
#endif
#endif

[Fact]
Expand All @@ -83,6 +114,20 @@ public void Rollback()
Assert.Equal(new int[0], results);
}

[Fact]
public void DbConnectionRollback()
{
DbConnection connection = m_connection;
connection.Execute("delete from transactions_test");
using (var trans = connection.BeginTransaction())
{
connection.Execute("insert into transactions_test values(1), (2)", transaction: trans);
trans.Rollback();
}
var results = connection.Query<int>(@"select value from transactions_test order by value;");
Assert.Equal(new int[0], results);
}

#if !BASELINE
[Fact]
public async Task RollbackAsync()
Expand Down Expand Up @@ -115,6 +160,22 @@ public async Task RollbackDisposeAsync()
var results = await m_connection.QueryAsync<int>(@"select value from transactions_test order by value;").ConfigureAwait(false);
Assert.Equal(new int[0], results);
}

#if !NET452 && !NET461 && !NET472 && !NETCOREAPP1_1_2 && !NETCOREAPP2_0 && !NETCOREAPP2_1
[Fact]
public async Task DbConnectionRollbackAsync()
{
DbConnection connection = m_connection;
await connection.ExecuteAsync("delete from transactions_test").ConfigureAwait(false);
using (var trans = await connection.BeginTransactionAsync().ConfigureAwait(false))
{
await connection.ExecuteAsync("insert into transactions_test values(1), (2)", transaction: trans).ConfigureAwait(false);
await trans.RollbackAsync().ConfigureAwait(false);
}
var results = await connection.QueryAsync<int>(@"select value from transactions_test order by value;").ConfigureAwait(false);
Assert.Equal(new int[0], results);
}
#endif
#endif

[Fact]
Expand Down

0 comments on commit 4ba6da3

Please sign in to comment.