public async Task <int> CommitAsync(
            CancellationToken cancellationToken = default,
            Guid?internalCommandId = null)
        {
            await _domainEventsDispatcher.DispatchEventsAsync();

            var options = new TransactionOptions
            {
                IsolationLevel = IsolationLevel.ReadCommitted
            };

            using var transaction = new TransactionScope(TransactionScopeOption.Required, options, TransactionScopeAsyncFlowOption.Enabled);

            await _aggregateStore.Save();

            await _outbox.Save();

            if (internalCommandId.HasValue)
            {
                using var connection = _sqlConnectionFactory.CreateNewConnection();
                await connection.ExecuteScalarAsync("UPDATE payments.InternalCommands " +
                                                    "SET ProcessedDate = @Date " +
                                                    "WHERE Id = @Id",
                                                    new
                {
                    Date = DateTime.UtcNow,
                    Id   = internalCommandId.Value
                });
            }

            transaction.Complete();

            return(0);
        }
        public async Task Save()
        {
            if (_messages.Any())
            {
                using var connection = _sqlConnectionFactory.CreateNewConnection();

                const string sql = "INSERT INTO [payments].[OutboxMessages] " +
                                   "([Id], [OccurredOn], [Type], [Data]) VALUES " +
                                   "(@Id, @OccurredOn, @Type, @Data)";

                foreach (var message in _messages)
                {
                    await connection.ExecuteScalarAsync(sql, new
                    {
                        message.Id,
                        message.OccurredOn,
                        message.Type,
                        message.Data
                    });
                }

                _messages.Clear();
            }
        }