protected override async Task ProcessEventsAsync(IReadOnlyList <EventData> events)
        {
            await BeforeProcessEventsAsync(RetryHandler.ServiceCancellationToken).ConfigureAwait(false);

            await RetryHandler.HandleAsync(async cancel =>
            {
                string lastOffset = null;
                using (var tx = StateManager.CreateTransaction())
                {
                    await AfterTransactionOpenAsync(tx, cancel).ConfigureAwait(false);
                    foreach (var @event in events)
                    {
                        await ProcessEventAsync(tx, @event, cancel).ConfigureAwait(false);
                        lastOffset = @event.SystemProperties.Offset;
                    }
                    await _offsets.SetAsync(tx, _partition, lastOffset).ConfigureAwait(false);
                    await BeforeTransactionCommitAsync(tx, cancel).ConfigureAwait(false);
                    await tx.CommitAsync().ConfigureAwait(false);
                }
            }, false, TransientExceptionChecker).ConfigureAwait(false);

            await AfterProcessEventsAsync(RetryHandler.ServiceCancellationToken).ConfigureAwait(false);
        }