private static async Task <(long bankAccountNo1, long bankAccountNo2)> CreateBankAccountsAsync(IScopedTransactionalDatabase transactionalStore) { _ba1AmountComparand = Rnd.Next(); _ba2AmountComparand = Rnd.Next(); var bankAccount1 = new BankAccount { Id = 1, Amount = _ba1AmountComparand }; var bankAccount2 = new BankAccount { Id = 2, Amount = _ba2AmountComparand }; try { await transactionalStore.StoreAsync(bankAccount1); await transactionalStore.StoreAsync(bankAccount2); await transactionalStore.TryCommitAsync(); } catch { await transactionalStore.RollbackAsync(); throw; } return(bankAccount1.Id, bankAccount2.Id); }
public async Task <bool> WriteToDatabaseAsync(IScopedTransactionalDatabase transactionalDatabase, CancellationToken cancellation) { // Write touched target metadata to database foreach (var(originalMetadata, touchedMetadata) in _targetMetadataCache.Values.Where(p => p.Touched)) { var comparandMetdata = await transactionalDatabase.GetAsync <ProjectionTargetMetadata>(p => p.Id == (originalMetadata ?? touchedMetadata).Id).FirstOrDefault(); if (!MatchesByRevision(originalMetadata, comparandMetdata)) { return(false); } if (touchedMetadata == null) { Assert(originalMetadata != null); await transactionalDatabase.RemoveAsync(originalMetadata, cancellation); } else { touchedMetadata.MetadataRevision = originalMetadata?.MetadataRevision ?? 1; await transactionalDatabase.StoreAsync(touchedMetadata, cancellation); } } // TODO: Do we have to check whether the targets were updated concurrently? foreach (var targetToUpdate in _targetsToUpdate) { await transactionalDatabase.StoreAsync(targetToUpdate, cancellation); } foreach (var targetToDelete in _targetsToDelete) { await transactionalDatabase.RemoveAsync(targetToDelete, cancellation); } return(true); }