180-spring框架开启事务的两种方式

第一种:@Tancational注解开启事务,注意这个注解只有方法public方法上才能有效

1)配置文件中配置事务管理器
    <!--声明事务管理器,在内部负责提交事务 commit() ,回滚事务 rollback()-->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
         <!--必须使用的属性数据源 DataSource,有了这个,我们才知道对那个数据库进行事物操作-->
        <property name="dataSource" ref="myDataSource" />
    </bean>

    <!--开启事务注解驱动:告诉spring要支持@Transactional的使用-->
   <tx:annotation-driven transaction-manager="transactionManager" />

2)在方法上加上@Trancational注解
     @Transactional(
             propagation = Propagation.REQUIRED,
             isolation = Isolation.REPEATABLE_READ,
             timeout = 20,
             rollbackFor = {NullPointerException.class,NotEnoughException.class})
    public void tranca(){}

 第二种:使用AspectJ配置文件开启事务

    <!--1.声明事务管理-->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="myDataSource" />
    </bean>

    <!--2.给相关方法添加上事务,advice其实就是通知,这里我们使用了aop面向切面-->
    <tx:advice id="myAdvic" transaction-manager="transactionManager">
         <!--
                 tx:method:指定给方法的事务属性
                 name:方法的名称,业务方法的名称(1.完整的方法名称,不带参数;2.使用通配符的方法名称,通配符是*)
                 isolation:隔离级别
                 propagation:传播行为
                 rollback-for:发送异常时回滚。他的值是异常类的全限定名
        -->
        <tx:attributes>
           <!--给一个具体的方法添加事务-->
            <tx:method name="buy" isolation="DEFAULT" propagation="REQUIRED"
                       rollback-for="java.lang.NullPointerException,com.wkcto.excep.NotEnoughException"/>
            <!--给所有方法添加事务-->
            <tx:method name="add*" isolation="REPEATABLE_READ" propagation="REQUIRES_NEW" />
            <tx:method name="modify*" isolation="DEFAULT" propagation="REQUIRED" />
            <tx:method name="remove*" />
            <!--其他方法 queryXXX, findXXX, searchXXX-->
            <tx:method name="*" propagation="SUPPORTS" isolation="DEFAULT" read-only="true" />
        </tx:attributes>
    </tx:advice>

    <!--3.配置aop-->
    <aop:config>
        <!--设置切入点表达式:哪些类中的方法要使用事务
            id:自定义的表达式名称
            expression:切入点表达式
            execution(* *..service..*.*(..)):表示所有service类中的所有方法
        -->
        <aop:pointcut id="servicePt" expression="execution(* *..service..*.*(..))"/>
        <!--配置增强器: 连接类和事务的方法 advice-ref: 通知的id;  pointcut-ref:切入点表达式的id -->
        <aop:advisor advice-ref="myAdvic" pointcut-ref="servicePt" />
    </aop:config>
原文地址:https://www.cnblogs.com/pogusanqian/p/12908793.html