Spring—事务管理

Spring事务管理分成了两类:编程式事务管理和声明式事务管理

一、编程式的事务管理

  • 手动编写代码进行事务管理 (很少使用)
配置:
<!-- 配置业务类 -->
<bean id="xxxService" class="com.genius.service.impl.xxxService">
    <property name="xxxDao" ref="xxxDao"></property>
    <!-- 注入事务管理模板 -->
    <property name="transactionTemplate" ref="transactionTemplate"></property>
</bean>
<!-- 配置事务管理模版:spring简化事务管理代码提供的类 -->
<bean id="transactionTemplate" class="org.springframework.transaction.support.TransactionTemplate">
    <property name="transactionManager" ref="transactionManager"></property>
</bean>
<!-- 配置事务管理器 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource"></property>
</bean>
调用:
public class XxxService {

    private XxxDao xxxDao;
    private TransactionTemplate transactionTemplate;
    public void transfer(){
        transactionTemplate.execute(new TransactionCallbackWithoutResult() {

            @Override
            protected void doInTransactionWithoutResult(TransactionStatus transactionStatus) {
                // TODO 事务业务处理操作
            }
        })
    }
}

二、声明式的事务管理

  • 基于TransactionProxyFactoryBean的方式(很少使用)
    注:需要为每个进行事务管理的类,配置一个TransactionProxyFactoryBean进行增强
配置:
<bean id="xxxService" class="com.genius.service.impl.xxxService">
    <property name="xxxDao" ref="xxxDao"></property>
</bean>
<!-- 配置事务管理器 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource"></property>
</bean>
<!-- 配置业务层的代理 -->
<bean id="xxxServiceProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
    <!-- 注入事务管理器 -->
    <property name="transactionManager" ref="transactionManager"></property>
    <!-- 配置目标Service -->
    <property name="target" ref="xxxService"></property>
    <!-- 注入事务属性 -->
    <property name="transactionAttributes">
        <props>
            <!--
                prop的格式:
                  * PROPAGATION :事务的传播行为
                  * ISOLATION   :事务的隔离级别
                  * readOnly    :只读(不可以进行修改,插入,删除)
                  * -Exception  :发生哪些异常回滚事务
                  * +Exception  :发生哪些异常不回滚事务
            -->
            <prop key="insert*">PROPAGATION_REQUIRED</prop>
        </props>
    </property>
</bean>
调用:
要注入代理类xxxServiceProxy而不能注入原有的类xxxService,否则事务不起作用
  • 基于AspectJ的XML方式(经常使用)
    注:一旦配置好之后,类上不需要添加任何东西(非常清楚的可以看出哪些类使用了事务)
配置:
<!-- 配置事务管理器 -->
<bean id="transactionManager"
    class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource" />
</bean>
<!-- 配置事务的通知(事务增强) -->
<tx:advice id="transactionAdvice" transaction-manager="transactionManager">
    <tx:attributes>
        <tx:method name="add*" propagation="REQUIRED" />
    </tx:attributes>
</tx:advice>
<!-- AOP 配置 -->
<aop:config>
    <!-- 配置切入点 -->
    <aop:pointcut id="transactionPointcut" expression="execution(* com.sinosoft.rpf.service..*Impl.*(..))" />
    <!-- 配置切面 -->
    <aop:advisor pointcut-ref="transactionPointcut" advice-ref="transactionAdvice" />
</aop:config>
调用:直接写业务类,不需要任何其它操作
  • 基于注解的方式(经常使用)
    注:配置很简单,使用方便,只需在业务层类上添加一个@Transaction的注解
配置:
<!-- 配置事务管理器 -->
<bean id="transactionManager"
    class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource" />
</bean>
<!-- 开启注解事务,如果不指定transaction-manager默认会查找名为transactionManager的bean -->
<tx:annotation-driven transaction-manager="transactionManager" />
调用:
业务类上添加@Transaction的注解即可完成事务管理

猜你喜欢

转载自blog.csdn.net/jiangjiandecsd/article/details/48676683