SpringBoot事务管理
来源:互联网 发布:海森伯格矩阵图片 编辑:程序博客网 时间:2024/06/05 20:07
起头自述
SpringBoot的事务管理和Spring的事务管理一样,只是SpringBoot相对而言更简单,不用配置事务管理器,省去配置文件的各种配置,只需要在application.yml中配置一个数据源即可。
编程式事务管理
- 使用
TransactionTemplate
使用TransactionTemplate
管理事务时仅需设置好数据源之后,在项目中注入即可,下面的代码演示使用TransactionTemplate
,封装了两个方法,一个执行又返回结果的事务,一个执行无返回结果的事务。
/** * 编程式事物管理方式 * * @author Juniter * @date 2017-11-17 */@Service@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)public class TransactionService { private static final Logger logger = LoggerFactory.getLogger(TransactionService.class); private final TransactionTemplate transactionTemplate; //通过构造方法注入一个PlatformTransactionManager SpringBoot会自动完成 public TransactionService(PlatformTransactionManager transactionManager) { Assert.notNull(transactionManager, "The 'transactionManager' argument must not be null."); this.transactionTemplate = new TransactionTemplate(transactionManager); //设置超时时间 this.transactionTemplate.setTimeout(300000); //设置事物策略 this.transactionTemplate.setIsolationLevel(TransactionDefinition.ISOLATION_REPEATABLE_READ); } /** * 执行有返回结果的事物 * @param executer * @param o 具体逻辑所需要的参数 * @return 执行后的返回结果 */ public <T> T doTransaction(final Executer<T> executer,Object...o) { return this.transactionTemplate.execute(new TransactionCallback<T>() { @Override public T doInTransaction(TransactionStatus status) { T t = null; try { t = executer.execute(o); }catch(Exception e) { //一旦出现异常便回滚 status.setRollbackOnly(); logger.error("Rollback For - > {}",e.getMessage()); } return t; } }); } /** * 执行没有返回结果的事物 * @param executer * @param o 具体逻辑所需要的参数 */ public void doTransactionWithoutResult(final ExecuterWithoutResult executer,Object...o) { this.transactionTemplate.execute(new TransactionCallbackWithoutResult() { @Override protected void doInTransactionWithoutResult(TransactionStatus status) { try { executer.execute(o); }catch (Exception e) { //一旦出现异常便回滚 status.setRollbackOnly(); logger.error("Rollback For - > {}",e.getMessage()); } } }); }}/** * 该接口用于执行具体的事物 * @author Juniter * * @param <T> */@FunctionalInterfacepublic interface Executer<T> { T execute(Object... o) throws Exception;}/** * 该接口用于执行具体的事物 * @author Juniter * * @param <T> */@FunctionalInterfacepublic interface ExecuterWithoutResult { void execute(Object... o) throws Exception;}
以下是一个使用的例子
@Servicepublic class TransactionSampleServcie { //注入事务管理的Service @Autowired private TransactionService transactionService; @Autowired private CityMapper cityMapper; @Autowired private HotelMapper hotelMapper; public void addNewHotel(HotelInfomation info) { this.transactionService.doTransactionWithoutResult(this::insertWithTransaction,info); } /** * 在该方法中执行的操作都是事务性的。 * @param info * @throws Exception */ private void insertWithTransaction(Object...info) throws Exception { HotelInfomation hotelInfo = (HotelInfomation) info[0]; Hotel hotel = new Hotel(); hotel.setAddress(hotelInfo.getAddress()); hotel.setName(hotelInfo.getName()); hotel.setZip(hotelInfo.getZip()); //按照名称查询City City city = this.cityMapper.selectCityByName(hotelInfo.getCity()); if(city !=null) { hotel.setCity(city.getId()); }else { city = new City(); city.setName(hotelInfo.getCity()); city.setCountry(hotelInfo.getCountry()); city.setState(hotelInfo.getState()); //保存City this.cityMapper.insertCity(city); //获取刚插入的City city = this.cityMapper.selectCityByName(hotelInfo.getCity()); hotel.setCity(city.getId()); } //看看Hotel是否存在,不存在便插入。 if(this.hotelMapper.selectHotelByExample(hotel)==null) this.hotelMapper.insertHotel(hotel); //throw new NullPointerException("测试事务回滚"); }}
声明式事务管理
声明式事务管理 在SpringBoot中直接使用@Transactional
注解便可,如下代码
@Servicepublic class AnnotatedTransaction { @Autowired private CityMapper cityMapper; @Autowired private HotelMapper hotelMapper; //该方法是事务性的,若要更多设置,请参照@Transactional注解,源码内有详细说明 @Transactional(rollbackFor = Exception.class) public void insertWithTransaction(HotelInfomation info) throws Exception { Hotel hotel = new Hotel(); hotel.setAddress(info.getAddress()); hotel.setName(info.getName()); hotel.setZip(info.getZip()); // 按照名称查询City City city = this.cityMapper.selectCityByName(info.getCity()); if (city != null) { hotel.setCity(city.getId()); } else { city = new City(); city.setName(info.getCity()); city.setCountry(info.getCountry()); city.setState(info.getState()); //保存City this.cityMapper.insertCity(city); //获取刚插入的City city = this.cityMapper.selectCityByName(info.getCity()); hotel.setCity(city.getId()); } //看看Hotel是否存在,不存在便插入。 if (this.hotelMapper.selectHotelByExample(hotel) == null) this.hotelMapper.insertHotel(hotel); //throw new Exception("测试事务回滚"); }}
阅读全文
0 0
- springboot事务管理
- SpringBoot事务管理
- springboot事务管理
- SpringBoot 事务管理
- springBoot事务管理
- springboot事务管理
- SpringBoot事务管理
- SpringBoot事务管理
- springboot+mybatis 事务管理
- springboot中的事务管理
- Springboot 事务管理控制
- springboot【14】事务管理
- SpringBoot+Mybatis事务管理
- SpringBoot中的事务管理
- springboot【29】事务管理
- springboot事务管理详解
- springboot分布式事务管理(atomikos)
- Springboot入门之分布式事务管理
- JSTL
- 点评cat-client解析
- Git rebase 和git merge 使用技巧20171119
- 模拟实现strcpy ,strstr,strcat,strcmp,memcpy,memmove
- Netty学习笔记(二) Channel和ChannelFuture
- SpringBoot事务管理
- JavaShowAlgorithm-使用2个栈实现队列
- Java并发编程札记-(一)基础-05线程安全问题
- 中介者模式
- 安卓VectorDrawable矢量图在原图基础上添加点击时 ripple 水波纹特效
- random随机数
- Eclipse插件springsource-tool-suite的下载和安装
- C语言_可变参数列表解析
- java基础(三)