private void SplitWrites(List<OutstandingWrite> writes)
		{
			for (var index = 0; index < writes.Count; index++)
			{
				var write = writes[index];
				try
				{
					_cancellationToken.ThrowIfCancellationRequested();

					using (var tx = _env.NewTransaction(TransactionFlags.ReadWrite))
					{
						HandleOperations(tx, new List<OutstandingWrite> { write }, _cancellationToken);
						tx.Commit();
						write.Completed();
					}
				}
				catch (Exception e)
				{
					if (e is SEHException)
					{
						e = new VoronUnrecoverableErrorException("Error occurred during write", new Win32Exception(error: e.HResult));
					}

					write.Errored(e);
				}
			}
		}
		private void HandleActualWrites(OutstandingWrite mine, CancellationToken token)
		{
			List<OutstandingWrite> writes = null;
			try
			{
				writes = BuildBatchGroup(mine);
			    var completedSuccessfully = false;

				using (var tx = _env.NewTransaction(TransactionFlags.ReadWrite))
				{
					HandleOperations(tx, writes, _cancellationToken);

					try
					{
						tx.Commit();
						if (ShouldRecordToDebugJournal)
							_debugJournal.Flush();

					    completedSuccessfully = true;
					}
					catch (Exception e)
					{
						if (e is SEHException)
						{
							e = new VoronUnrecoverableErrorException("Error occurred during write", new Win32Exception(error: e.HResult));
						}

						// if we have an error during the commit, we can't recover, just fail them all.
						foreach (var write in writes)
						{
							write.Errored(e);
						}
					}
				}

                if (completedSuccessfully)
                {
                    foreach (var write in writes)
                        write.Completed();
                }
			}
			catch (Exception e)
			{
				if (e is SEHException)
				{
					e = new VoronUnrecoverableErrorException("Error occurred during write", new Win32Exception(error: e.HResult));
				}

				HandleWriteFailure(writes, mine, e);
			}
		}