第一种:@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>