Spring 不会完全回滚所有事务

Spring does not fully rollback all the transactions

提问人:user1923944 提问时间:11/30/2022 更新时间:11/30/2022 访问量:18

问:

我有一个 spring 应用程序,其中访问任何服务的典型路径如下所示:

Util 类 -> 工厂类 -> 服务类 -> dao

有一个模块可以处理与工作流审批相关的所有内容,因此为了使用任何服务,我将调用以下内容: WorkflowLocalServiceUtil -> WorflowFactory -> WorkflowLocalServiceImplementaion -> WorkflowDAO

我有一个服务,当我调用它时,它将调用其他 5 个服务来执行数据库事务(所有方法都在同一 WorkflowService 上定义),如下所示:

WorkflowLocalServiceUtil.addAll() -> WorkflowLocalServiceUtil.add1() & & WorkflowLocalServiceUtil.add2() & & WorkflowLocalServiceUtil.add3() & & WorkflowLocalServiceUtil.add4() & & WorkflowLocalServiceUtil.add5()。

我故意在服务函数中抛出一个未经检查的异常,该异常将由 WorkflowLocalServiceUtil.addAll() 调用,以查看是否执行的所有 5 个事务都将回滚。

我发现 spring 部分回滚(有些事务确实回滚,有些则没有)

以下是我的配置:

<bean id="com.sage.workflow.service.WorkflowLocalService" 
        class="com.sage.workflow.service.WorkflowLocalServiceImpl">
        <property name="wfTrainingRequestDAO" ref="WFTrainingRequestDAO" />
        <property name="wfTrainingRequestLevelDAO" ref="WFTrainingRequestLevelDAO" />
        <property name="wfTrainingRequestAttachmentDAO" ref="WFTrainingRequestAttachmentDAO" />
        <property name="wfTrainingRequestQueryDAO" ref="WFTrainingRequestQueryDAO" />
        <property name="wFTrainingRequestEmailDAO" ref="WFTrainingRequestEmailDAO" />
        <property name="wFTrainingRequestNomineeDAO" ref="WFTrainingRequestNomineeDAO" />
        <property name="wFTrainingRequestLevelNomineeDAO" ref="WFTrainingRequestLevelNomineeDAO" />
        <property name="wFTrainingRequestCGroupDAO" ref="WFTrainingRequestCGroupDAO" />
    </bean>
    <bean id="com.sage.workflow.service.WorkflowLocalService.transaction"
        class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"
        lazy-init="true">
        <property name="transactionManager">
            <ref bean="txManager" />
        </property>
        <property name="target">
            <ref bean="com.sage.workflow.service.WorkflowLocalService" />
        </property>
        <property name="transactionAttributes">
            <props>
                <prop key="add*">PROPAGATION_REQUIRED</prop>
                <prop key="delete*">PROPAGATION_REQUIRED</prop>
                <prop key="update*">PROPAGATION_REQUIRED</prop>
                <prop key="set*">PROPAGATION_REQUIRED</prop>
                <prop key="review*">PROPAGATION_REQUIRED</prop>
                <prop key="*">PROPAGATION_SUPPORTS,readOnly</prop>
            </props>
        </property>
    </bean>
    
    <bean id="com.sage.workflow.service.WorkflowLocalServiceFactory"
        class="com.sage.workflow.service.WorkflowLocalServiceFactory"
        lazy-init="true">
        <property name="service">
            <ref bean="com.sage.workflow.service.WorkflowLocalService.transaction" />
        </property>
    </bean>
<bean id="txManager"
        class="org.springframework.orm.hibernate3.HibernateTransactionManager">
        <property name="sessionFactory">
            <ref local="sessionFactory" />
        </property>
    </bean>
    <!-- Workflow DAOs -->
    <bean id="WFTrainingRequestDAO"
        class="com.sage.workflow.dao.WFTrainingRequestDAO">
        <property name="sessionFactory">
            <ref bean="sessionFactory" />
        </property>
    </bean>
    <bean id="WFTrainingRequestLevelDAO"
        class="com.sage.workflow.dao.WFTrainingRequestLevelDAO">
        <property name="sessionFactory">
            <ref bean="sessionFactory" />
        </property>
    </bean>
    <bean id="WFTrainingRequestAttachmentDAO"
        class="com.sage.workflow.dao.WFTrainingRequestAttachmentDAO">
        <property name="sessionFactory">
            <ref bean="sessionFactory" />
        </property>
    </bean>
    <bean id="WFTrainingRequestQueryDAO"
        class="com.sage.workflow.dao.WFTrainingRequestQueryDAO">
        <property name="sessionFactory">
            <ref bean="sessionFactory" />
        </property>
    </bean>
    <bean id="WFTrainingRequestEmailDAO"
        class="com.sage.workflow.dao.WFTrainingRequestEmailDAO">
        <property name="sessionFactory">
            <ref bean="sessionFactory" />
        </property>
    </bean>
    <bean id="WFTrainingRequestNomineeDAO"
        class="com.sage.workflow.dao.WFTrainingRequestNomineeDAO">
        <property name="sessionFactory">
            <ref bean="sessionFactory" />
        </property>
    </bean>
    <bean id="WFTrainingRequestLevelNomineeDAO"
        class="com.sage.workflow.dao.WFTrainingRequestLevelNomineeDAO">
        <property name="sessionFactory">
            <ref bean="sessionFactory" />
        </property>
    </bean>
    <bean id="WFTrainingRequestCGroupDAO"
        class="com.sage.workflow.dao.WFTrainingRequestCGroupDAO">
        <property name="sessionFactory">
            <ref bean="sessionFactory" />
        </property>
    </bean>

我的问题是,为什么 spring 没有回滚所有交易?

MySQL Spring 事务 XML 配置

评论


答: 暂无答案