コード例 #1
0
            public async Task UpdateState(ITransactionStateEntity <TState> state)
            {
                await EnsureInsertBufferFlushed();

                await _dbExecuter.ExecuteQuery(async db =>
                {
                    var(stateValue, transactionManager) = GetSerializables(state);

                    var rowsUpdated = await db.Query(_stateTableName)
                                      .Where("state_id", _stateId)
                                      .Where("sequence_id", state.SequenceId)
                                      .AsUpdate(new[] { "transaction_manager", "value", "timestamp", "transaction_id" },
                                                new object[]
                    {
                        transactionManager,
                        stateValue,
                        state.Timestamp,
                        state.TransactionId
                    })
                                      .FirstOrDefaultAsync <int>().ConfigureAwait(false);
                    if (rowsUpdated != 1)
                    {
                        throw new InvalidOperationException("Something went wrong while persisting existing state");
                    }
                });
            }
コード例 #2
0
        protected override Task <ITransactionStateEntity <TState> > PersistState(
            PendingTransactionState <TState> pendingState,
            long?commitUpTo,
            ITransactionStateEntity <TState> existingState = null) => ExecuteQuery <ITransactionStateEntity <TState> >(
            async db =>
        {
            var transactionManager =
                JsonConvert.SerializeObject(pendingState.TransactionManager, _jsonSettings);
            var stateValue = pendingState.State != null
                    ? JsonConvert.SerializeObject(pendingState.State, _jsonSettings)
                    : null;

            if (existingState == null)
            {
                await db.Query(_options.StateTableName).AsInsert(new[]
                {
                    "state_id", "sequence_id", "transaction_manager", "value", "timestamp", "transaction_id"
                },
                                                                 new object[]
                {
                    _stateId,
                    pendingState.SequenceId,
                    transactionManager,
                    stateValue,
                    pendingState.TimeStamp,
                    pendingState.TransactionId
                }).FirstOrDefaultAsync();
            }
            else
            {
                var rowsUpdated = await db.Query(_options.StateTableName)
                                  .Where("state_id", _stateId)
                                  .Where("sequence_id", existingState.SequenceId)
                                  .AsUpdate(new[] { "transaction_manager", "value", "timestamp", "transaction_id", "state_type" },
                                            new object[]
                {
                    transactionManager,
                    stateValue,
                    pendingState.TimeStamp,
                    pendingState.TransactionId
                }).FirstOrDefaultAsync <int>();

                if (rowsUpdated != 1)
                {
                    throw new InvalidOperationException("Something went wrong while persisting existing state");
                }
            }

            return(new TransactionalState
            {
                Value = pendingState.State,
                SequenceId = pendingState.SequenceId,
                TransactionId = pendingState.TransactionId,
                TransactionManager = pendingState.TransactionManager,
                Timestamp = pendingState.TimeStamp
            });
        });
コード例 #3
0
            public async Task InsertState(ITransactionStateEntity <TState> state)
            {
                _insertStateBuffer.Add(state);

                if (_insertStateBuffer.Count <= 1000)
                {
                    return;
                }
                await EnsureInsertBufferFlushed();
            }
コード例 #4
0
            private (string StateValue, string TransactionManager) GetSerializables(
                ITransactionStateEntity <TState> state)
            {
                var transactionManager =
                    JsonConvert.SerializeObject(state.TransactionManager, _jsonSettings);
                var stateValue = state.Value != null
                    ? JsonConvert.SerializeObject(state.Value, _jsonSettings)
                    : null;

                return(stateValue, transactionManager);
            }
コード例 #5
0
 private object[] CreatePropertyBagForInsert(ITransactionStateEntity <TState> state)
 {
     var(stateValue, transactionManager) = GetSerializables(state);
     return(new object[]
     {
         _stateId,
         state.SequenceId,
         transactionManager,
         stateValue,
         state.Timestamp,
         state.TransactionId
     });
 }
コード例 #6
0
        protected override Task RemoveAbortedState(ITransactionStateEntity <TState> state)
        => ExecuteQuery(async db =>
        {
            var rowsDeleted = await db.Query(_options.StateTableName)
                              .Where("state_id", _stateId)
                              .Where("sequence_id", state.SequenceId)
                              .DeleteAsync().ConfigureAwait(false);

            Console.WriteLine(rowsDeleted);

            if (rowsDeleted != 1)
            {
                throw new InvalidOperationException("Something went wrong when trying to delete transaction state");
            }
        });
        public async Task <string> Store(string expectedETag, TransactionalStateMetaData metadata,
                                         List <PendingTransactionState <TState> > statesToPrepare, long?commitUpTo,
                                         long?abortAfter)
        {
            if (abortAfter.HasValue && _states.Any())
            {
                while (_states.Count > 0 && _states[_states.Count - 1].SequenceId > abortAfter)
                {
                    var entity = _states[_states.Count - 1];
                    await RemoveAbortedState(entity).ConfigureAwait(false);

                    _states.RemoveAt(_states.Count - 1);
                }
            }

            if (statesToPrepare != null)
            {
                foreach (var s in statesToPrepare)
                {
                    ITransactionStateEntity <TState> existingState = null;
                    if (FindState(s.SequenceId, out var pos))
                    {
                        existingState = _states[pos];
                    }

                    var persistedState = await PersistState(s, commitUpTo, existingState).ConfigureAwait(false);

                    if (existingState == null)
                    {
                        _states.Insert(pos, persistedState);
                    }
                    else
                    {
                        _states[pos] = persistedState;
                    }
                }
            }

            Metadata = await PersistMetadata(metadata, commitUpTo ?? Metadata.CommittedSequenceId)
                       .ConfigureAwait(false);
            await StoreFinalize(commitUpTo).ConfigureAwait(false);

            return(Metadata.ETag);
        }
 protected abstract Task RemoveAbortedState(ITransactionStateEntity <TState> state);
 protected abstract Task <ITransactionStateEntity <TState> > PersistState(PendingTransactionState <TState> pendingState,
                                                                          long?commitUpTo,
                                                                          ITransactionStateEntity <TState> existingState = null);