Exemple #1
0
        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);
        }
Exemple #2
0
            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);
            }