Class CoreTransactionAttemptContext


  • @Internal
    public class CoreTransactionAttemptContext
    extends Object
    Provides methods to allow an application's transaction logic to read, mutate, insert and delete documents, as well as commit or rollback the transaction.
    • Field Detail

      • TRANSACTION_STATE_BIT_COMMIT_NOT_ALLOWED

        public static final int TRANSACTION_STATE_BIT_COMMIT_NOT_ALLOWED
        See Also:
        Constant Field Values
      • TRANSACTION_STATE_BIT_APP_ROLLBACK_NOT_ALLOWED

        public static final int TRANSACTION_STATE_BIT_APP_ROLLBACK_NOT_ALLOWED
        See Also:
        Constant Field Values
      • TRANSACTION_STATE_BIT_SHOULD_NOT_ROLLBACK

        public static final int TRANSACTION_STATE_BIT_SHOULD_NOT_ROLLBACK
        See Also:
        Constant Field Values
      • TRANSACTION_STATE_BIT_SHOULD_NOT_RETRY

        public static final int TRANSACTION_STATE_BIT_SHOULD_NOT_RETRY
        See Also:
        Constant Field Values
      • STATE_BITS_POSITION_FINAL_ERROR

        public static final int STATE_BITS_POSITION_FINAL_ERROR
        See Also:
        Constant Field Values
      • STATE_BITS_MASK_FINAL_ERROR

        public static final int STATE_BITS_MASK_FINAL_ERROR
        See Also:
        Constant Field Values
      • DEFAULT_DELAY_RETRYING_OPERATION

        public static final Duration DEFAULT_DELAY_RETRYING_OPERATION
    • Method Detail

      • core

        public Core core()
      • scheduler

        public Scheduler scheduler()
        Bear in mind, in this code with the blocking API:
         cluster.transactions().run((ctx) -> {
             Thread ct = Thread.currentThread();
        
             ctx.insert(collection, docId, content);
        
             Thread ct2 = Thread.currentThread();
         });
         
        ct will _always_ equal ct2 (which is what we want), regardless of what we do with schedulers. As there's no way to change the current thread of execution in that way.

        We put things onto our scheduler for the benefit of reactive users. Because we don't want to pass control back to user space (the lambda) while still on a limited internal SDK thread.

      • attemptId

        public String attemptId()
        Returns the globally unique ID of this attempt, which may be useful for debugging and logging purposes.
      • transactionId

        public String transactionId()
        Returns the globally unique ID of the overall transaction owning this attempt, which may be useful for debugging and logging purposes.
      • get

        public Mono<CoreTransactionGetResult> get​(CollectionIdentifier collection,
                                                  String id)
        Gets a document with the specified id and from the specified Couchbase bucket.

        Parameters:
        collection - the Couchbase collection the document exists on
        id - the document's ID
        Returns:
        a TransactionGetResultInternal containing the document
      • insert

        public Mono<CoreTransactionGetResult> insert​(CollectionIdentifier collection,
                                                     String id,
                                                     byte[] content,
                                                     SpanWrapper pspan)
        Inserts a new document into the specified Couchbase collection.
        Parameters:
        collection - the Couchbase collection in which to insert the doc
        id - the document's unique ID
        content - the content to insert
        Returns:
        the doc, updated with its new CAS value and ID, and converted to a TransactionGetResultInternal
      • commit

        public Mono<Void> commit()
        Commits the transaction. All staged replaces, inserts and removals will be written.

        The semantics are the same as commit(), except that the a Mono is returned so the operation can be performed asynchronously.

      • rollback

        public Mono<Void> rollback()
        Rolls back the transaction. All staged replaces, inserts and removals will be removed. The transaction will not be retried, so this will be the final attempt.
      • operationFailed

        public TransactionOperationFailedException operationFailed​(boolean updateInternalState,
                                                                   TransactionOperationFailedException err)
        Rollback errors rules: Errors during auto-rollback: do not update internal state, as the user cares more about the original error that provoked the rollback Errors during app-rollback: do update internal state. Nothing else has gone wrong with the transaction, and the user will care about rollback problems. If !updateInternalState, the internal state bits are not changed.
      • queryWrapperLocked

        public Mono<ClassicCoreReactiveQueryResult> queryWrapperLocked​(int sidx,
                                                                       @Nullable
                                                                       CoreQueryContext qc,
                                                                       String statement,
                                                                       @Nullable
                                                                       CoreQueryOptions options,
                                                                       String hookPoint,
                                                                       boolean isBeginWork,
                                                                       boolean existingErrorCheck,
                                                                       @Nullable
                                                                       com.couchbase.client.core.deps.com.fasterxml.jackson.databind.node.ObjectNode txdata,
                                                                       @Nullable
                                                                       com.couchbase.client.core.deps.com.fasterxml.jackson.databind.node.ArrayNode params,
                                                                       @Nullable
                                                                       SpanWrapper span,
                                                                       boolean tximplicit,
                                                                       AtomicReference<ReactiveLock.Waiter> lockToken,
                                                                       boolean updateInternalState)
        This will return a TransactionOperationFailedException if that's what query returns, else will return the error after passing through convertQueryError.

        If an error is universally handled the same way, then convertQueryError will return a TransactionOperationFailedException.

        Because this is a general-purpose wrapper, TransactionOperationFaileds will _not_ be added to internal errors array. So the transaction is allowed to continue after failures, unless the caller prevents it. Update: appears to no longer be the case. Keep this routine in sync with queryWrapperReactiveLocked.

        Parameters:
        lockToken - if null, the lock is held throughout