def commit_transaction(self): """Commit a multi-statement transaction. .. versionadded:: 3.7 """ self._check_ended() state = self._transaction.state if state is _TxnState.NONE: raise InvalidOperation("No transaction started") elif state in (_TxnState.STARTING, _TxnState.COMMITTED_EMPTY): # Server transaction was never started, no need to send a command. self._transaction.state = _TxnState.COMMITTED_EMPTY return elif state is _TxnState.ABORTED: raise InvalidOperation( "Cannot call commitTransaction after calling abortTransaction") try: self._finish_transaction_with_retry("commitTransaction") except ConnectionFailure as exc: # We do not know if the commit was successfully applied on the # server, set the unknown commit error label. exc._error_labels = ("UnknownTransactionCommitResult",) reraise_instance(exc, trace=sys.exc_info()[2]) except OperationFailure as exc: if exc.code not in _RETRYABLE_ERROR_CODES: # The server reports errorLabels in the case. raise # We do not know if the commit was successfully applied on the # server, set the unknown commit error label. exc._error_labels = ("UnknownTransactionCommitResult",) reraise_instance(exc, trace=sys.exc_info()[2]) finally: self._transaction.state = _TxnState.COMMITTED
def _reraise_with_unknown_commit(exc): """Re-raise an exception with the UnknownTransactionCommitResult label.""" exc._add_error_label("UnknownTransactionCommitResult") reraise_instance(exc, trace=sys.exc_info()[2])