SpringBoot事物Transaction实战讲解教程 (3)

application.properties的文件的配置:

banner.charset=UTF-8 server.tomcat.uri-encoding=UTF-8 spring.http.encoding.charset=UTF-8 spring.http.encoding.enabled=true spring.http.encoding.force=true spring.messages.encoding=UTF-8 spring.application.name=springboot-transactional server.port=8182 spring.datasource.url=jdbc:mysql://localhost:3306/springBoot?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true spring.datasource.username=root spring.datasource.password=123456 spring.datasource.driverClassName=com.mysql.jdbc.Driver spring.datasource.type=com.alibaba.druid.pool.DruidDataSource spring.datasource.initialSize=5 spring.datasource.minIdle=5 spring.datasource.maxActive=20 spring.datasource.maxWait=60000 spring.datasource.timeBetweenEvictionRunsMillis=60000 spring.datasource.minEvictableIdleTimeMillis=300000 spring.datasource.validationQuery=SELECT 1 FROM DUAL spring.datasource.testWhileIdle=true spring.datasource.testOnBorrow=false spring.datasource.testOnReturn=false spring.datasource.poolPreparedStatements=true spring.datasource.maxPoolPreparedStatementPerConnectionSize=20 spring.datasource.filters=stat,wall,log4j spring.datasource.connectionProperties=druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000 logging.level.com.pancm.dao=debug 代码编写

SpringBoot在使用事物Transactional的时候,要在main方法上加上 @EnableTransactionManagement 注解开发事物声明,在使用的service层的公共方法加上 @Transactional (spring)注解。

使用示例一

那么首先我们来看下 @Transactional 这个注解的使用方法吧,只需要你在需要添加公共方法上面添加该注解即可。但是这么使用的话需要你将异常抛出,由spring进行去控制。

代码示例:

@Transactional public boolean test1(User user) throws Exception { long id = user.getId(); System.out.println("查询的数据1:" + udao.findById(id)); // 新增两次,会出现主键ID冲突,看是否可以回滚该条数据 udao.insert(user); System.out.println("查询的数据2:" + udao.findById(id)); udao.insert(user); return false; } 使用示例二

如果我们在使用事物 @Transactional 的时候,想自己对异常进行处理的话,那么我们可以进行手动回滚事物。在catch中加上 TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); 方法进行手动回滚。不过需要注意的是发生异常需要第一时间进行手动回滚事物,也就是要在异常抛出之前!

代码示例:

@Transactional public boolean test2(User user) { long id = user.getId(); try { System.out.println("查询的数据1:" + udao.findById(id)); // 新增两次,会出现主键ID冲突,看是否可以回滚该条数据 udao.insert(user); System.out.println("查询的数据2:" + udao.findById(id)); udao.insert(user); } catch (Exception e) { System.out.println("发生异常,进行手动回滚!"); // 手动回滚事物 TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); e.printStackTrace(); } return false; } 使用示例三

如果我们在使用事物 @Transactional 的时候,调用了其他的子方法进行了数据库的操作,但是我们想使其事物生效的话,我们可以使用rollbackFor注解或者将该子方法的异常抛出由调用的方法进行处理,不过这里需要注意的是,子方法也必须是公共的方法!

代码示例:

@Transactional public boolean test3(User user) { /* * 子方法出现异常进行回滚 */ try { System.out.println("查询的数据1:" + udao.findById(user.getId())); deal1(user); deal2(user); deal3(user); } catch (Exception e) { System.out.println("发生异常,进行手动回滚!"); // 手动回滚事物 TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); e.printStackTrace(); } return false; } public void deal1(User user) throws SQLException { udao.insert(user); System.out.println("查询的数据2:" + udao.findById(user.getId())); } public void deal2(User user) throws SQLException{ if(user.getAge()<20){ //SQL异常 udao.insert(user); }else{ user.setAge(21); udao.update(user); System.out.println("查询的数据3:" + udao.findById(user.getId())); } } @Transactional(rollbackFor = SQLException.class) public void deal3(User user) { if(user.getAge()>20){ //SQL异常 udao.insert(user); } } 使用示例四

如果我们不想使用事物 @Transactional 注解,想自己进行事物控制(编程事物管理),控制某一段的代码事物生效,但是又不想自己去编写那么多的代码,那么可以使用springboot中的DataSourceTransactionManager和TransactionDefinition这两个类来结合使用,能够达到手动控制事物的提交回滚。不过在进行使用的时候,需要注意在回滚的时候,要确保开启了事物但是未提交,如果未开启或已提交的时候进行回滚是会在catch里面发生异常的!

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wsxpyw.html