Mybatis声明式事务

2020-08-07  本文已影响0人  c_gentle

一、声明式事务

1.声明式事务是指利用注解非侵入式实现事务提交与回滚的方法
2.使用方法:在方法或类上增加@Transactional,一般应用在Service上
3.触发时机:进入方法前开启事务,执行成功提交,抛出运行时异常回滚

二、声明式事务使用套路

  1. 在applicationContext中开启注解式声明式事务
 <!-- 事务管理器transactionManager提供了声明式事务的支持,在程序成功提交,运行时异常回滚 -->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"/>
    </bean>
    <!-- 开启注解形式的声明式事务 -->
    <tx:annotation-driven transaction-manager="transactionManager"/>
  1. 利用@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);
        }
    }
   
  1. 设置事务传播为PROPAGATION_NOT_SUPPORTED不使用事务
 /*不使用事务,方法注解优先级比类注解高*/
    @Transactional(propagation = Propagation.NOT_SUPPORTED , readOnly = true)
    public Goods findById(Integer goodsId) {
        return  goodsMapper.findById(goodsId);
    }
}
上一篇 下一篇

猜你喜欢

热点阅读