一、声明式事务
1.声明式事务是指利用注解非侵入式实现事务提交与回滚的方法
2.使用方法:在方法或类上增加@Transactional,一般应用在Service上
3.触发时机:进入方法前开启事务,执行成功提交,抛出运行时异常回滚
二、声明式事务使用套路
- 在applicationContext中开启注解式声明式事务
<!-- 事务管理器transactionManager提供了声明式事务的支持,在程序成功提交,运行时异常回滚 --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"/> </bean> <!-- 开启注解形式的声明式事务 --> <tx:annotation-driven transaction-manager="transactionManager"/>
- 利用@Transactional描述事务
@Service //写在类上,默认所有方法应用声明式事务 @Transactional(rollbackFor = Exception.class) public class GoodsService { @Resource private GoodsMapper goodsMapper; /* @Transactional 当方法执行成功时自动提交,抛出RuntimeException及其子类时自动回滚 利用rollbackFor = Exception.class遇到所有类型异常都会滚 */ @Transactional(rollbackFor = Exception.class) public void initGoods() throws ParseException { for (int i = 1; i <= 10; i++) { if(i==3){ // throw new ParseException("",1); // throw new RuntimeException("Fail"); } Goods goods = new Goods(); goods.setTitle("批量导入测试" + i); goods.setSubTitle(""); goods.setOriginalCost(0f); goods.setCurrentPrice(0f); goods.setDiscount(0f); goods.setIsFreeDelivery(1); goods.setCategoryId(44); goodsMapper.insert(goods); } }
- 设置事务传播为PROPAGATION_NOT_SUPPORTED不使用事务
/*不使用事务,方法注解优先级比类注解高*/ @Transactional(propagation = Propagation.NOT_SUPPORTED , readOnly = true) public Goods findById(Integer goodsId) { return goodsMapper.findById(goodsId); } }