云南省工程建设造价协会网站,免费建手机商城网站,深圳制作网站搜行者seo,wordpress网站响应速度插件概念
在MySQL中介绍过#xff0c;当同一时间出现一起读写数据的情况#xff0c;可能会导致最终的结果出错#xff0c;因此可以使用事务来提高隔离级别 而Spring中也可以实现事务
手动添加事务
使用SpringBoot中的DataSourceTransactionManager对象可以获取事务#xff0…概念
在MySQL中介绍过当同一时间出现一起读写数据的情况可能会导致最终的结果出错因此可以使用事务来提高隔离级别 而Spring中也可以实现事务
手动添加事务
使用SpringBoot中的DataSourceTransactionManager对象可以获取事务提交事务回滚事务
TransactionDefinition是事务的属性在获取事务时需要传入这个参数
而TransactionStatus则是在获取事务时获取的对象最终回滚时使用
RestController
RequestMapping(url)
public class 实现类 {Autowiredprivate DataSourceTransactionManager transactionManager;Autowiredprivate TransactionDefinition transactionDefinition;RequestMapping(url)public 相关方法() {//开启事务TransactionStatus transactionStatus transactionManager.getTransaction(transactionDefinition);//处理事务//回滚事务transactionManager.rollback(transactionStatus);}例如
RestController
RequestMapping(/user)
public class UserController {Autowiredprivate UserService userService;Autowiredprivate DataSourceTransactionManager transactionManager;Autowiredprivate TransactionDefinition transactionDefinition;RequestMapping(/add)public int add(UserInfo userInfo) {if (userInfo null || !StringUtils.hasLength(userInfo.getUsername()) ||!StringUtils.hasLength(userInfo.getPassword())) {return 0;}//开启事务TransactionStatus transactionStatus transactionManager.getTransaction(transactionDefinition);int result userService.add(userInfo);//回滚事务transactionManager.rollback(transactionStatus);return result;}
}在页面中传输了参数username 1, password 1 但是在数据库中并没有出现这行数据
自动添加事务
使用Transactional注解可以快速添加事务
Transactional
RequestMapping(/insert)
public Integer insert(UserInfo userInfo) {if (userInfo null || !StringUtils.hasLength(userInfo.getUsername()) ||!StringUtils.hasLength(userInfo.getPassword())) {return 0;}int result userService.add(userInfo);}return result;
}如果没有异常那么会自动提交事务如果有异常事务会进行回滚
例如在类中添加空指针异常 如果没有添加Transactional那么在异常出现前数据已经上传到数据库
RequestMapping(/insert)
public Integer insert(UserInfo userInfo) {if (userInfo null || !StringUtils.hasLength(userInfo.getUsername()) ||!StringUtils.hasLength(userInfo.getPassword())) {return 0;}int result userService.add(userInfo);int num 1 / 0;return result;
}而加了Transactional注解就可以自动回滚事务数据库中就没有这行数据了 而如果我们添加了trycatch语句spring就不会感知到异常的存在了也就不会进行事务的回滚了
Transactional //声明式事务没有错误自动提交
RequestMapping(/insert)
public Integer insert(UserInfo userInfo) {if (userInfo null || !StringUtils.hasLength(userInfo.getUsername()) ||!StringUtils.hasLength(userInfo.getPassword())) {return 0;}int result userService.add(userInfo);try{int num 1 / 0;} catch (Exception e){e.printStackTrace()}return result;
}如果我们还想要事务进行自动回滚那么可以使用throw将异常抛出这样spring就能再次感知到异常的存在了
Transactional //声明式事务没有错误自动提交
RequestMapping(/insert)
public Integer insert(UserInfo userInfo) {if (userInfo null || !StringUtils.hasLength(userInfo.getUsername()) ||!StringUtils.hasLength(userInfo.getPassword())) {return 0;}int result userService.add(userInfo);try{int num 10 / 0;} catch (Exception e){e.printStackTrace();throw e;}return result;
}如果不想要页面出现报错信息那么可以不添加throw语句而是手动回滚事务
Transactional //声明式事务没有错误自动提交
RequestMapping(/insert)
public Integer insert(UserInfo userInfo) {if (userInfo null || !StringUtils.hasLength(userInfo.getUsername()) ||!StringUtils.hasLength(userInfo.getPassword())) {return 0;}int result userService.add(userInfo);try{int num 10 / 0;} catch (Exception e){e.printStackTrace();TransactionAspectSupport.currentTransactionStatus().setRollbackOnly()}return result;
}事务隔离级别设置
当不同事务同时对数据库进行数据操作就会出现问题因此可以针对不同的情景设置不同的隔离级别
在Transactional注解中可以设置事务的隔离级别
代码含义问题Isolation.DEFAULT默认级别 以数据库隔离级别执行Isolation.READ_UNCOMMITTED读未提交 可以读未提交数据存在脏读问题Isolation.READ_COMMITED读已提交 只能读到已经提交事务存在不可重复读问题Isolation.REPEATABLE_READ可重复读存在幻读问题Isolation.SERIALIZABLE串行化性能低
事务传播机制
在项目中会存在多个方法链式调用而每一个方法都有可能存在事务因此存在不同的事物传播机制 分别有如下几种事物传播级别
代码说明Propagation.REQUIRED(默认)如果当前存在事务则加入事务都则创建一个事务Propagation.SUPPORTS如果当前存在事务就加入事务否则就以非事务方式运行Propagation.MANDATORY如果当前存在事务就加入事务否则抛出异常Propagation.REQUIRES_NEW不管当前有没有事务都创建并使用新事务Propagation.NOT_SUPPORTED不管当前有没有事务都以非事务方式运行Propagation.NEVER以非事务形式运行如果当前存在事务就抛出异常Propagation.NESTED如果当前存在事务则创建一个事务作为当前事务的嵌套事务运行当作REQUIRED