一、声明式事务
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);
}
}
网友评论