什么是声明式事务?什么是编程式事务?
声明式事务:即咱们在类上或者是方法上加上的@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; }