8000 Add transaction logging. Fixes #1411 · mysql-net/MySqlConnector@7d38fe5 · GitHub
[go: up one dir, main page]

Skip to content

Commit 7d38fe5

Browse files
committed
Add transaction logging. Fixes #1411
1 parent e400950 commit 7d38fe5

File tree

5 files changed

+44
-3
lines changed

5 files changed

+44
-3
lines changed

src/MySqlConnector/Logging/EventIds.cs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,14 @@ internal static class EventIds
131131
public const int ColumnMappingAlreadyHasExpression = 2508;
132132
public const int SettingExpressionToMapColumn = 2509;
133133

134+
// Transaction events, 2700-2799
135+
public const int StartingTransaction = 2700;
136+
public const int StartedTransaction = 2701;
137+
public const int CommittingTransaction = 2702;
138+
public const int CommittedTransaction = 2703;
139+
public const int RollingBackTransaction = 2704;
140+
public const int RolledBackTransaction = 2705;
141+
134142
// Connection pool events, 3000-3099
135143
public const int WaitingForAvailableSession = 3000;
136144
public const int CreatingNewConnectionPool = 3001;

src/MySqlConnector/Logging/Log.cs

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -324,6 +324,24 @@ internal static partial class Log
324324
[LoggerMessage(EventIds.SettingExpressionToMapColumn, LogLevel.Trace, "Setting expression to map column {SourceOrdinal} to {DestinationColumn}: {Expression}")]
325325
public static partial void SettingExpressionToMapColumn(ILogger logger, int sourceOrdinal, string destinationColumn, string expression);
326326

327+
[LoggerMessage(EventIds.StartingTransaction, LogLevel.Debug, "Session {SessionId} starting transaction")]
328+
public static partial void StartingTransaction(ILogger logger, string sessionId);
329+
330+
[LoggerMessage(EventIds.StartedTransaction, LogLevel.Trace, "Session {SessionId} started transaction")]
331+
public static partial void StartedTransaction(ILogger logger, string sessionId);
332+
333+
[LoggerMessage(EventIds.CommittingTransaction, LogLevel.Trace, "Session {SessionId} committing transaction")]
334+
public static partial void CommittingTransaction(ILogger logger, string sessionId);
335+
336+
[LoggerMessage(EventIds.CommittedTransaction, LogLevel.Debug, "Session {SessionId} committed transaction")]
337+
public static partial void CommittedTransaction(ILogger logger, string sessionId);
338+
339+
[LoggerMessage(EventIds.RollingBackTransaction, LogLevel.Trace, "Session {SessionId} rolling back transaction")]
340+
public static partial void RollingBackTransaction(ILogger logger, string sessionId);
341+
342+
[LoggerMessage(EventIds.RolledBackTransaction, LogLevel.Debug, "Session {SessionId} rolled back transaction")]
343+
public static partial void RolledBackTransaction(ILogger logger, string sessionId);
344+
327345
[LoggerMessage(EventIds.WaitingForAvailableSession, LogLevel.Trace, "Pool {PoolId} waiting for an available session")]
328346
public static partial void WaitingForAvailableSession(ILogger logger, int poolId);
329347

src/MySqlConnector/Logging/MySqlConnectorLoggingConfiguration.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ internal sealed class MySqlConnectorLoggingConfiguration(ILoggerFactory loggerFa
1010
public ILogger CommandLogger { get; } = loggerFactory.CreateLogger("MySqlConnector.MySqlCommand");
1111
public ILogger PoolLogger { get; } = loggerFactory.CreateLogger("MySqlConnector.ConnectionPool");
1212
public ILogger BulkCopyLogger { get; } = loggerFactory.CreateLogger("MySqlConnector.MySqlBulkCopy");
13+
public ILogger TransactionLogger { get; } = loggerFactory.CreateLogger("MySqlConnector.Transaction");
1314

1415
public static MySqlConnectorLoggingConfiguration NullConfiguration { get; } = new MySqlConnectorLoggingConfiguration(NullLoggerFactory.Instance);
1516
public static MySqlConnectorLoggingConfiguration GlobalConfiguration { get; set; } = NullConfiguration;

src/MySqlConnector/MySqlConnection.cs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ private MySqlConnection(string connectionString, MySqlConnectorLoggingConfigurat
4646
m_connectionString = connectionString;
4747
LoggingConfiguration = loggingConfiguration;
4848
m_logger = loggingConfiguration.ConnectionLogger;
49+
m_transactionLogger = loggingConfiguration.TransactionLogger;
4950
}
5051

5152
#pragma warning disable CA2012 // Safe because method completes synchronously
@@ -146,8 +147,10 @@ private async ValueTask<MySqlTransaction> BeginTransactionAsync(IsolationLevel i
146147
if (m_enlistedTransaction is not null)
147148
throw new InvalidOperationException("Cannot begin a transaction when already enlisted in a transaction.");
148149

150+
Log.StartingTransaction(m_transactionLogger, m_session!.Id);
151+
149152
// get the bytes for both payloads concatenated together (suitable for pipelining)
150-
var startTransactionPayload = GetStartTransactionPayload(isolationLevel, isReadOnly, m_session!.SupportsQueryAttributes);
153+
var startTransactionPayload = GetStartTransactionPayload(isolationLevel, isReadOnly, m_session.SupportsQueryAttributes);
151154

152155
if (GetInitializedConnectionSettings() is { UseCompression: false, Pipelining: not false })
153156
{
@@ -175,7 +178,7 @@ private async ValueTask<MySqlTransaction> BeginTransactionAsync(IsolationLevel i
175178
OkPayload.Verify(payload.Span, m_session.SupportsDeprecateEof, m_session.SupportsSessionTrack);
176179
}
177180

178-
var transaction = new MySqlTransaction(this, isolationLevel);
181+
var transaction = new MySqlTransaction(this, isolationLevel, m_transactionLogger);
179182
CurrentTransaction = transaction;
180183
return transaction;
181184
}
@@ -1259,6 +1262,7 @@ private ConnectionSettings GetConnectionSettings() =>
12591262

12601263
private readonly MySqlDataSource? m_dataSource;
12611264
private readonly ILogger m_logger;
1265+
private readonly ILogger m_transactionLogger;
12621266
private string m_connectionString;
12631267
private ConnectionSettings? m_connectionSettings;
12641268
private ServerSession? m_session;

src/MySqlConnector/MySqlTransaction.cs

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
using System.Net.Sockets;
2+
using Microsoft.Extensions.Logging;
3+
using MySqlConnector.Logging;
24
using MySqlConnector.Protocol.Serialization;
35
using MySqlConnector.Utilities;
46

@@ -30,11 +32,13 @@ private async Task CommitAsync(IOBehavior ioBehavior, CancellationToken cancella
3032
VerifyValid();
3133

3234
using var activity = Connection!.Session.StartActivity("Commit");
35+
Log.CommittingTransaction(m_logger, Connection.Session.Id);
3336
try
3437
{
3538
using (var cmd = new MySqlCommand("commit", Connection, this) { NoActivity = true })
3639
await cmd.ExecuteNonQueryAsync(ioBehavior, cancellationToken).ConfigureAwait(false);
3740
Connection!.CurrentTransaction = null;
41+
Log.CommittedTransaction(m_logger, Connection.Session.Id);
3842
Connection = null;
3943
}
4044
catch (Exception ex) when (activity is { IsAllDataRequested: true })
@@ -254,19 +258,24 @@ private async Task DoDisposeAsync(IOBehavior ioBehavior, CancellationToken cance
254258
Connection = null;
255259
}
256260

257-
internal MySqlTransaction(MySqlConnection connection, IsolationLevel isolationLevel)
261+
internal MySqlTransaction(MySqlConnection connection, IsolationLevel isolationLevel, ILogger logger)
258262
{
259263
Connection = connection;
260264
IsolationLevel = isolationLevel;
265+
m_logger = logger;
266+
267+
Log.StartedTransaction(m_logger, Connection.Session.Id);
261268
}
262269

263270
private async Task DoRollback(IOBehavior ioBehavior, CancellationToken cancellationToken)
264271
{
265272
using var activity = Connection!.Session.StartActivity("Rollback");
273+
Log.RollingBackTransaction(m_logger, Connection.Session.Id);
266274
try
267275
{
268276
using var cmd = new MySqlCommand("rollback", Connection, this) { NoActivity = true };
269277
await cmd.ExecuteNonQueryAsync(ioBehavior, cancellationToken).ConfigureAwait(false);
278+
Log.RolledBackTransaction(m_logger, Connection.Session.Id);
270279
}
271280
catch (Exception ex) when (activity is { IsAllDataRequested: true })
272281
{
@@ -293,5 +302,6 @@ private void VerifyValid()
293302

294303
private static string QuoteIdentifier(string identifier) => "`" + identifier.Replace("`", "``") + "`";
295304

305+
private readonly ILogger m_logger;
296306
private bool m_isDisposed;
297307
}

0 commit comments

Comments
 (0)
0