Search in sources :

Example 1 with ExecutionException

use of io.seata.tm.api.TransactionalExecutor.ExecutionException in project seata by seata.

the class DbAndReportTcStateLogStore method beginTransaction.

protected void beginTransaction(StateMachineInstance machineInstance, ProcessContext context) {
    if (sagaTransactionalTemplate != null) {
        StateMachineConfig stateMachineConfig = (StateMachineConfig) context.getVariable(DomainConstants.VAR_NAME_STATEMACHINE_CONFIG);
        TransactionInfo transactionInfo = new TransactionInfo();
        transactionInfo.setTimeOut(stateMachineConfig.getTransOperationTimeout());
        transactionInfo.setName(Constants.SAGA_TRANS_NAME_PREFIX + machineInstance.getStateMachine().getName());
        try {
            GlobalTransaction globalTransaction = sagaTransactionalTemplate.beginTransaction(transactionInfo);
            machineInstance.setId(globalTransaction.getXid());
            context.setVariable(DomainConstants.VAR_NAME_GLOBAL_TX, globalTransaction);
            Map<String, Object> machineContext = machineInstance.getContext();
            if (machineContext != null) {
                machineContext.put(DomainConstants.VAR_NAME_GLOBAL_TX, globalTransaction);
            }
        } catch (ExecutionException e) {
            String xid = null;
            if (e.getTransaction() != null) {
                xid = e.getTransaction().getXid();
            }
            throw new EngineExecutionException(e, e.getCode() + ", TransName:" + transactionInfo.getName() + ", XID: " + xid + ", Reason: " + e.getMessage(), FrameworkErrorCode.TransactionManagerError);
        } finally {
            if (Boolean.TRUE.equals(context.getVariable(DomainConstants.VAR_NAME_IS_ASYNC_EXECUTION))) {
                RootContext.unbind();
                RootContext.unbindBranchType();
            }
        }
    }
}
Also used : TransactionInfo(io.seata.tm.api.transaction.TransactionInfo) GlobalTransaction(io.seata.tm.api.GlobalTransaction) DbStateMachineConfig(io.seata.saga.engine.config.DbStateMachineConfig) DefaultStateMachineConfig(io.seata.saga.engine.impl.DefaultStateMachineConfig) StateMachineConfig(io.seata.saga.engine.StateMachineConfig) EngineExecutionException(io.seata.saga.engine.exception.EngineExecutionException) ExecutionException(io.seata.tm.api.TransactionalExecutor.ExecutionException) EngineExecutionException(io.seata.saga.engine.exception.EngineExecutionException)

Example 2 with ExecutionException

use of io.seata.tm.api.TransactionalExecutor.ExecutionException in project seata by seata.

the class DbAndReportTcStateLogStore method branchRegister.

protected void branchRegister(StateInstance stateInstance, ProcessContext context) {
    if (sagaTransactionalTemplate != null) {
        StateMachineConfig stateMachineConfig = (StateMachineConfig) context.getVariable(DomainConstants.VAR_NAME_STATEMACHINE_CONFIG);
        if (stateMachineConfig instanceof DbStateMachineConfig && !((DbStateMachineConfig) stateMachineConfig).isSagaBranchRegisterEnable()) {
            if (LOGGER.isDebugEnabled()) {
                LOGGER.debug("sagaBranchRegisterEnable = false, skip register branch. state[" + stateInstance.getName() + "]");
            }
            return;
        }
        // Register branch
        try {
            StateMachineInstance machineInstance = stateInstance.getStateMachineInstance();
            GlobalTransaction globalTransaction = getGlobalTransaction(machineInstance, context);
            if (globalTransaction == null) {
                throw new EngineExecutionException("Global transaction is not exists", FrameworkErrorCode.ObjectNotExists);
            }
            String resourceId = stateInstance.getStateMachineInstance().getStateMachine().getName() + "#" + stateInstance.getName();
            long branchId = sagaTransactionalTemplate.branchRegister(resourceId, null, globalTransaction.getXid(), null, null);
            stateInstance.setId(String.valueOf(branchId));
        } catch (TransactionException e) {
            throw new EngineExecutionException(e, "Branch transaction error: " + e.getCode() + ", StateMachine:" + stateInstance.getStateMachineInstance().getStateMachine().getName() + ", XID: " + stateInstance.getStateMachineInstance().getId() + ", State:" + stateInstance.getName() + ", stateId: " + stateInstance.getId() + ", Reason: " + e.getMessage(), FrameworkErrorCode.TransactionManagerError);
        } catch (ExecutionException e) {
            throw new EngineExecutionException(e, "Branch transaction error: " + e.getCode() + ", StateMachine:" + stateInstance.getStateMachineInstance().getStateMachine().getName() + ", XID: " + stateInstance.getStateMachineInstance().getId() + ", State:" + stateInstance.getName() + ", stateId: " + stateInstance.getId() + ", Reason: " + e.getMessage(), FrameworkErrorCode.TransactionManagerError);
        }
    }
}
Also used : TransactionException(io.seata.core.exception.TransactionException) GlobalTransaction(io.seata.tm.api.GlobalTransaction) DbStateMachineConfig(io.seata.saga.engine.config.DbStateMachineConfig) DefaultStateMachineConfig(io.seata.saga.engine.impl.DefaultStateMachineConfig) StateMachineConfig(io.seata.saga.engine.StateMachineConfig) EngineExecutionException(io.seata.saga.engine.exception.EngineExecutionException) ExecutionException(io.seata.tm.api.TransactionalExecutor.ExecutionException) EngineExecutionException(io.seata.saga.engine.exception.EngineExecutionException) DbStateMachineConfig(io.seata.saga.engine.config.DbStateMachineConfig) StateMachineInstance(io.seata.saga.statelang.domain.StateMachineInstance)

Example 3 with ExecutionException

use of io.seata.tm.api.TransactionalExecutor.ExecutionException in project seata by seata.

the class DbAndReportTcStateLogStore method branchReport.

protected void branchReport(StateInstance stateInstance, ProcessContext context) {
    if (sagaTransactionalTemplate != null) {
        StateMachineConfig stateMachineConfig = (StateMachineConfig) context.getVariable(DomainConstants.VAR_NAME_STATEMACHINE_CONFIG);
        if (stateMachineConfig instanceof DbStateMachineConfig && !((DbStateMachineConfig) stateMachineConfig).isSagaBranchRegisterEnable()) {
            if (LOGGER.isDebugEnabled()) {
                LOGGER.debug("sagaBranchRegisterEnable = false, skip branch report. state[" + stateInstance.getName() + "]");
            }
            return;
        }
        BranchStatus branchStatus = null;
        // find out the original state instance, only the original state instance is registered on the server, and its status should
        // be reported.
        StateInstance originalStateInst = null;
        if (StringUtils.hasLength(stateInstance.getStateIdRetriedFor())) {
            if (isUpdateMode(stateInstance, context)) {
                originalStateInst = stateInstance;
            } else {
                originalStateInst = findOutOriginalStateInstanceOfRetryState(stateInstance);
            }
            if (ExecutionStatus.SU.equals(stateInstance.getStatus())) {
                branchStatus = BranchStatus.PhaseTwo_Committed;
            } else if (ExecutionStatus.FA.equals(stateInstance.getStatus()) || ExecutionStatus.UN.equals(stateInstance.getStatus())) {
                branchStatus = BranchStatus.PhaseOne_Failed;
            } else {
                branchStatus = BranchStatus.Unknown;
            }
        } else if (StringUtils.hasLength(stateInstance.getStateIdCompensatedFor())) {
            if (isUpdateMode(stateInstance, context)) {
                originalStateInst = stateInstance.getStateMachineInstance().getStateMap().get(stateInstance.getStateIdCompensatedFor());
            } else {
                originalStateInst = findOutOriginalStateInstanceOfCompensateState(stateInstance);
            }
        }
        if (originalStateInst == null) {
            originalStateInst = stateInstance;
        }
        if (branchStatus == null) {
            if (ExecutionStatus.SU.equals(originalStateInst.getStatus()) && originalStateInst.getCompensationStatus() == null) {
                branchStatus = BranchStatus.PhaseTwo_Committed;
            } else if (ExecutionStatus.SU.equals(originalStateInst.getCompensationStatus())) {
                branchStatus = BranchStatus.PhaseTwo_Rollbacked;
            } else if (ExecutionStatus.FA.equals(originalStateInst.getCompensationStatus()) || ExecutionStatus.UN.equals(originalStateInst.getCompensationStatus())) {
                branchStatus = BranchStatus.PhaseTwo_RollbackFailed_Retryable;
            } else if ((ExecutionStatus.FA.equals(originalStateInst.getStatus()) || ExecutionStatus.UN.equals(originalStateInst.getStatus())) && originalStateInst.getCompensationStatus() == null) {
                branchStatus = BranchStatus.PhaseOne_Failed;
            } else {
                branchStatus = BranchStatus.Unknown;
            }
        }
        try {
            StateMachineInstance machineInstance = stateInstance.getStateMachineInstance();
            GlobalTransaction globalTransaction = getGlobalTransaction(machineInstance, context);
            if (globalTransaction == null) {
                throw new EngineExecutionException("Global transaction is not exists", FrameworkErrorCode.ObjectNotExists);
            }
            sagaTransactionalTemplate.branchReport(globalTransaction.getXid(), Long.parseLong(originalStateInst.getId()), branchStatus, null);
        } catch (TransactionException e) {
            LOGGER.error("Report branch status to server error: {}, StateMachine:{}, StateName:{}, XID: {}, branchId: {}, branchStatus:{}," + " Reason:{} ", e.getCode(), originalStateInst.getStateMachineInstance().getStateMachine().getName(), originalStateInst.getName(), originalStateInst.getStateMachineInstance().getId(), originalStateInst.getId(), branchStatus, e.getMessage(), e);
        } catch (ExecutionException e) {
            LOGGER.error("Report branch status to server error: {}, StateMachine:{}, StateName:{}, XID: {}, branchId: {}, branchStatus:{}," + " Reason:{} ", e.getCode(), originalStateInst.getStateMachineInstance().getStateMachine().getName(), originalStateInst.getName(), originalStateInst.getStateMachineInstance().getId(), originalStateInst.getId(), branchStatus, e.getMessage(), e);
        }
    }
}
Also used : TransactionException(io.seata.core.exception.TransactionException) GlobalTransaction(io.seata.tm.api.GlobalTransaction) DbStateMachineConfig(io.seata.saga.engine.config.DbStateMachineConfig) DefaultStateMachineConfig(io.seata.saga.engine.impl.DefaultStateMachineConfig) StateMachineConfig(io.seata.saga.engine.StateMachineConfig) BranchStatus(io.seata.core.model.BranchStatus) EngineExecutionException(io.seata.saga.engine.exception.EngineExecutionException) ExecutionException(io.seata.tm.api.TransactionalExecutor.ExecutionException) EngineExecutionException(io.seata.saga.engine.exception.EngineExecutionException) DbStateMachineConfig(io.seata.saga.engine.config.DbStateMachineConfig) StateInstance(io.seata.saga.statelang.domain.StateInstance) StateMachineInstance(io.seata.saga.statelang.domain.StateMachineInstance)

Example 4 with ExecutionException

use of io.seata.tm.api.TransactionalExecutor.ExecutionException in project seata by seata.

the class DbAndReportTcStateLogStore method reportTransactionFinished.

protected void reportTransactionFinished(StateMachineInstance machineInstance, ProcessContext context) {
    if (sagaTransactionalTemplate != null) {
        try {
            GlobalTransaction globalTransaction = getGlobalTransaction(machineInstance, context);
            if (globalTransaction == null) {
                throw new EngineExecutionException("Global transaction is not exists", FrameworkErrorCode.ObjectNotExists);
            }
            GlobalStatus globalStatus;
            if (ExecutionStatus.SU.equals(machineInstance.getStatus()) && machineInstance.getCompensationStatus() == null) {
                globalStatus = GlobalStatus.Committed;
            } else if (ExecutionStatus.SU.equals(machineInstance.getCompensationStatus())) {
                globalStatus = GlobalStatus.Rollbacked;
            } else if (ExecutionStatus.FA.equals(machineInstance.getCompensationStatus()) || ExecutionStatus.UN.equals(machineInstance.getCompensationStatus())) {
                globalStatus = GlobalStatus.RollbackRetrying;
            } else if (ExecutionStatus.FA.equals(machineInstance.getStatus()) && machineInstance.getCompensationStatus() == null) {
                globalStatus = GlobalStatus.Finished;
            } else if (ExecutionStatus.UN.equals(machineInstance.getStatus()) && machineInstance.getCompensationStatus() == null) {
                globalStatus = GlobalStatus.CommitRetrying;
            } else {
                globalStatus = GlobalStatus.UnKnown;
            }
            sagaTransactionalTemplate.reportTransaction(globalTransaction, globalStatus);
        } catch (ExecutionException e) {
            LOGGER.error("Report transaction finish to server error: {}, StateMachine: {}, XID: {}, Reason: {}", e.getCode(), machineInstance.getStateMachine().getName(), machineInstance.getId(), e.getMessage(), e);
        } catch (TransactionException e) {
            LOGGER.error("Report transaction finish to server error: {}, StateMachine: {}, XID: {}, Reason: {}", e.getCode(), machineInstance.getStateMachine().getName(), machineInstance.getId(), e.getMessage(), e);
        } finally {
            // clear
            RootContext.unbind();
            RootContext.unbindBranchType();
            sagaTransactionalTemplate.triggerAfterCompletion();
            sagaTransactionalTemplate.cleanUp();
        }
    }
}
Also used : TransactionException(io.seata.core.exception.TransactionException) GlobalStatus(io.seata.core.model.GlobalStatus) GlobalTransaction(io.seata.tm.api.GlobalTransaction) EngineExecutionException(io.seata.saga.engine.exception.EngineExecutionException) ExecutionException(io.seata.tm.api.TransactionalExecutor.ExecutionException) EngineExecutionException(io.seata.saga.engine.exception.EngineExecutionException)

Aggregations

EngineExecutionException (io.seata.saga.engine.exception.EngineExecutionException)4 GlobalTransaction (io.seata.tm.api.GlobalTransaction)4 ExecutionException (io.seata.tm.api.TransactionalExecutor.ExecutionException)4 TransactionException (io.seata.core.exception.TransactionException)3 StateMachineConfig (io.seata.saga.engine.StateMachineConfig)3 DbStateMachineConfig (io.seata.saga.engine.config.DbStateMachineConfig)3 DefaultStateMachineConfig (io.seata.saga.engine.impl.DefaultStateMachineConfig)3 StateMachineInstance (io.seata.saga.statelang.domain.StateMachineInstance)2 BranchStatus (io.seata.core.model.BranchStatus)1 GlobalStatus (io.seata.core.model.GlobalStatus)1 StateInstance (io.seata.saga.statelang.domain.StateInstance)1 TransactionInfo (io.seata.tm.api.transaction.TransactionInfo)1