コード例 #1
0
        public void Prepare(long sequenceNumber, Guid transactionId, DateTime timestamp,
                            ITransactionParticipant transactionManager, TState state)
        {
            prepare++;
            total++;

            if (MetaData.TimeStamp < timestamp)
            {
                MetaData.TimeStamp = timestamp;
            }

            if (prepares == null)
            {
                prepares = new SortedDictionary <long, PendingTransactionState <TState> >();
            }

            var tmstring = (transactionManager == null) ? null :
                           JsonConvert.SerializeObject(transactionManager, MetaData.SerializerSettings);

            prepares[sequenceNumber] = new PendingTransactionState <TState>
            {
                SequenceId         = sequenceNumber,
                TransactionId      = transactionId.ToString(),
                TimeStamp          = timestamp,
                TransactionManager = tmstring,
                State = state
            };

            if (cancelAbove < sequenceNumber)
            {
                cancelAbove = sequenceNumber;
            }
        }
コード例 #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
ファイル: StateEntity.cs プロジェクト: NigelYu/Nigel
 public static StateEntity Create <T>(JsonSerializerSettings JsonSettings,
                                      string partitionKey, PendingTransactionState <T> pendingState)
     where T : class, new()
 {
     return(new StateEntity
     {
         TransactionId = pendingState.TransactionId,
         TransactionTimestamp = pendingState.TimeStamp,
         TransactionManager = JsonConvert.SerializeObject(pendingState.TransactionManager, JsonSettings),
         StateJson = JsonConvert.SerializeObject(pendingState.State, JsonSettings)
     });
 }
コード例 #4
0
 public static StateEntity Create <T>(JsonSerializerSettings JsonSettings,
                                      string partitionKey, PendingTransactionState <T> pendingState)
     where T : class, new()
 {
     return(new StateEntity
     {
         PartitionKey = partitionKey,
         RowKey = MakeRowKey(pendingState.TransactionId, pendingState.SequenceId),
         TransactionId = pendingState.TransactionId,
         SequenceId = pendingState.SequenceId,
         StateJson = JsonConvert.SerializeObject(pendingState.State, JsonSettings)
     });
 }
        private PendingTransactionState <TState> MakePendingState(long seqno, TState val, bool tm)
        {
            var result = new PendingTransactionState <TState>()
            {
                SequenceId         = seqno,
                TimeStamp          = DateTime.UtcNow,
                TransactionId      = Guid.NewGuid().ToString(),
                TransactionManager = tm ? default(ParticipantId) : MakeParticipantId(),
                State = new TState()
            };

            result.State = val;
            return(result);
        }
コード例 #6
0
        public async Task <string> Confirm(string expectedETag, string metadata, string transactionIdToCommit)
        {
            if (this.StateStorage.Etag != expectedETag)
            {
                throw new ArgumentException(nameof(expectedETag), "Etag does not match");
            }
            this.StateStorage.State.Metadata = metadata;
            PendingTransactionState <TState> committedState = this.StateStorage.State.PendingStates.FirstOrDefault(pending => transactionIdToCommit == pending.TransactionId);

            if (committedState != null)
            {
                this.StateStorage.State.CommittedTransactionId = committedState.TransactionId;
                this.StateStorage.State.CommittedState         = committedState.State;
                this.StateStorage.State.PendingStates          = StateStorage.State.PendingStates.Where(pending => pending.SequenceId > committedState.SequenceId).ToList();
            }
            await this.StateStorage.WriteStateAsync();

            return(this.StateStorage.Etag);
        }
 protected abstract Task <ITransactionStateEntity <TState> > PersistState(PendingTransactionState <TState> pendingState,
                                                                          long?commitUpTo,
                                                                          ITransactionStateEntity <TState> existingState = null);