Spring开发过程中的声明式事务和编程式事务

什么是声明式事务?什么是编程式事务?

  声明式事务:即咱们在类上或者是方法上加上的@Transactional注解,建立在AOP之上的;其本质是对方法前后进行拦截,然后在目标方法开始之前创建或者加入一个事务,在执行完目标方法之后根据执行情况提交或者回滚事务。声明式事务最大的优点就是不需要通过编程的方式管理事务,这样就不需要在业务逻辑代码中掺杂事务管理的代码,只需在配置文件中做相关的事务规则声明即可;

  编程式事务:相比声明式事务的非侵入式的开发方式,编程式事务需要自己通过编程式事务管理使用TransactionTemplate或者直接使用底层的PlatformTransactionManager来实现事务;Spring更推崇使用TransactionTemplate来实现编程式事务;

 

各自优缺点:

  声明式事务:非侵入式的开发方式;业务代码不收污染;简单,方便;事务粒度最小在一个方法上

  编程式事务:相对于声明式事务唯一的优点就是事务粒度更精细;

 

编程式事务应用场景:

  实际开发过程中可能会遇到类似:同一个事务中新增数据,掉远程接口,在修改数据,但是调用远程接口会有延迟,可能需要等待一段时间,遇到这种情况,如果都在声明式事务一个事务下处理,那么相当于是一个事务处理了几秒中,在事务处理的过程中,是占用了一个数据库的连接,都知道数据库的连接是有限制的,一个事务占用几秒中的数据库连接是属于较大的资源浪费,这是后可以使用编程式事务,控制成事务块;

 

编程式事务代码:

    @Autowired
    private TransactionTemplate transactionTemplate;


    public boolean transactionTemplateExample() throws InterruptedException {
        //事务一
         String brandId = transactionTemplate.execute(new TransactionCallback<String>() {
            @Override
            public String doInTransaction(TransactionStatus status) {
                BaseBrand brand = new BaseBrand();
                brand.setBrandName("1223");
                brand.setBrandStatus("001");
                brand = brandDao.save(brand);
                return brand.getBrandId();
            }
        });
        if (!StringUtil.isEmpty(brandId)) {
            //调用远程接口
            // TODO: 2018/12/17
            Thread.sleep(3000);
        }

        //事务二修改数据
        boolean result = transactionTemplate.execute(new TransactionCallback<Boolean>() {
            @Override
            public Boolean doInTransaction(TransactionStatus status) {
                BaseBrand brand = new BaseBrand();
                brand.setBrandId(brandId);
                brand.setBrandName("1223");
                brand.setBrandStatus("002");
                brandDao.save(brand);
                return true;
            }
        });
        return result;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值