当前位置: 首页 > news >正文

网站模板教程优秀企业网站欣赏

网站模板教程,优秀企业网站欣赏,dw网站建设的数据库,用dw做音乐网站系统的代码文章目录一、编程式事务二、声明式事务#xff08;常用#xff09;三、事务实战详解3.1#xff09;事务的回滚机制3.2#xff09;事务的传播3.3#xff09;事务超时时间3.4#xff09;事务隔离级别3.5#xff09;事务回滚条件Spring中对事务有两种支持方式#xff0c;分… 文章目录一、编程式事务二、声明式事务常用三、事务实战详解3.1事务的回滚机制3.2事务的传播3.3事务超时时间3.4事务隔离级别3.5事务回滚条件Spring中对事务有两种支持方式分别是编程式事务与声明式事务 一、编程式事务 可通过TransactionManager、TransactionTemplate两大内置事务管理对象来完成 // Spring内置事务管理器对象 Autowired private PlatformTransactionManager transactionManager;/*** 通过编程式事务来控制数据库交互:* 更新菜品价格 - 自定义transactionManager来控制事务*/ public int updateDishPrice(MapString, Object paramMap) {// 1. 首先定义默认的事务属性与隔离级别DefaultTransactionDefinition transactionDefinition new DefaultTransactionDefinition();transactionDefinition.setIsolationLevel(TransactionDefinition.ISOLATION_DEFAULT);// 2. 获取TransactionStatusTransactionStatus status transactionManager.getTransaction(transactionDefinition);int result 0;try {result dishMapper.updateDish(paramMap);// int i 1 / 0; 模拟报错请求// 提交事务transactionManager.commit(status);} catch (DataAccessException e) {LogUtil.error(DishServices.updateDishPrice, e.getMessage());// 回滚事务transactionManager.rollback(status);}return result; }// Spring内置事务模板对象 Autowired private TransactionTemplate transactionTemplate;/*** 通过编程式事务来控制数据库交互:* 更新菜品代码 - 自定义transactionTemplate来控制事务*/ public int updateDishCode(MapString, Object paramMap) {// 设置事务隔离级别transactionTemplate.setIsolationLevel(TransactionDefinition.ISOLATION_DEFAULT);return transactionTemplate.execute(status - {int result 0;try {result dishMapper.updateDish(paramMap);// int i 1 / 0; // 模拟报错请求} catch (DataAccessException e) {LogUtil.error(MySpringBoot.updateDishCode, e.getMessage());status.setRollbackOnly();}return result;}); }二、声明式事务常用 声明式事务通过在方法上加Transactional注解实现可以在注解中定义一些事务参数例如事务传播行为PROPAGATION、事务超时时间TIMEOUT、事务隔离级别ISOLATION、事务回滚条件ROLLBACKFOR Transactional(timeout 30, isolation Isolation.DEFAULT, rollbackFor DataAccessException.class) public int updateDishStatus(MapString, Object paramMap) {int result dishMapper.updateDish(paramMap);// int i 1 / 0; // 模拟报错请求return result; }PROPAGATIONPROPAGATION_REQUIRED这是事务的默认传播行为, 表示如果当前存在事务则加入该事务, 如果当前没有事务则创建一个新的事务.A-B, A如果有事务则B加入该事务(A影响B), 如果A没有则B会自己创建一个事务(B不影响A)PROPAGATION_REQUIRES_NEW无论如何都创建一个新的事务, 如果当前存在事务则把当前事务挂起, 且开启的事务与外部事务相互独立, 互不干扰. A-B, A不影响B, 他们是两个独立的事务; B不影响APROPAGATION_NESTED如果当前存在事务就在当前事务中执行, 否则执行PROPAGATION_REQUIRED逻辑 A-B, A影响B, B不影响APROPAGATION_SUPPORTS如果当前存在事务, 则加入该事务; 如果当前没有事务, 则以非事务的方式继续运行PROPAGATION_NOT_SUPPORTED以非事务的方式运行, 如果当前存在事务的话则把当前事务挂起PROPAGATION_MANDATORY如果当前存在事务, 则加入该事务; 如果当前没有事务, 则抛出异常PROPAGATION_NEVER以非事务方式运行, 如果当前存在事务, 则抛出异常 三、事务实战详解 3.1事务的回滚机制 // 准备一个接口一个service Transactional(propagation Propagation.REQUIRED) public int insertDishDefault() {MapString, Object paramMap new HashMap();...int result dishMapper.insertDishDefault(paramMap);throw new RuntimeException(); }查看数据库可以发现期望的数据并没有被插入但是切面日志表的数据是插入成功的并且在进入该事务方法insertDishDefault前的其他方法操作也是成功执行的所以事务的回滚不会影响到在它作用范围之外的sqlSession。 仔细查看数据库中的数据变化对比有事务控制与无事务控制的方法会先发无事务的方法对DB的操作都是实时的可以打断点查看但是有事务的方法则是要等到事务提交才会影响DB这和数据库里面的事务是一样的Spring的底层也是用了AOP代理来完成事务控制的。 3.2事务的传播 Propagation属性默认是REQUIRED事务的传播机制涉及到多种不同的情况同时也是面试中的高频考点下面列举几个常见的场景下述场景均只讨论默认的事务传播机制 有事务Controller层 - 无事务Services层 GetMapping(/insert) Transactional(propagation Propagation.REQUIRED) public int insert() {Ticket ticket new Ticket();ticket.setDeparture(黑龙江);ticket.setDestination(广州);ticketMapper.insert(ticket);return dishServices.insertDishDefault(); // 无事务方法插入数据让其抛出异常 }结果Ticket与Dish表均插入数据失败。所以不同类中有事务的方法 - 无事务的方法后者会自动加入前者的事务且它们是同一个事务如果是前者抛异常后者也会回滚此处不演示。 有事务Services层 - 无事务Services层 Transactional(propagation Propagation.REQUIRED) public int insertDishDefault() {MapString, Object paramMap new HashMap();...testsw(); // testsw() 是同类的无事务方法插入数据让其抛出异常return result; }结果Ticket与Dish表均插入数据失败。所以同一个类中有事务的方法 - 无事务的方法后者会自动加入前者的事务且它们是同一个事务如果是前者抛异常后者也会回滚此处不演示。 无事务Controller层 - 有事务Services层 GetMapping(/insert) public int insert() {Ticket ticket new Ticket();ticket.setDeparture(黑龙江);ticket.setDestination(广州);ticketMapper.insert(ticket);return dishServices.insertDishDefault(); // 有事务方法插入数据让其抛出异常 }结果Ticket插入成功Dish插入失败。所以不同类中无事务的方法 - 有事务的方法后者不会影响前者也可以通过数据库看出来当Controller层代码执行完之后Tick就已经被实时插入了。如果是前者抛出异常前者不会回滚后者需要看无事务方法是否已经执行完毕如果已经执行完毕则不会回滚事务方法一旦被执行完毕就会提交。 无事务Services层 - 有事务Services层重要 // 同一个类中Dish插入无事务的方法调用有事务的方法 Transactional(propagation Propagation.REQUIRED) public void testsw() {Ticket ticket new Ticket();ticket.setDeparture(黑龙江);ticket.setDestination(广州);ticketMapper.insert(ticket);throw new RuntimeException(); // 同类中无事务调用该有有事务有事务抛出异常 }结果Ticket与Dish均插入成功Dish能插入成功因为其没有事务控制实时就插入了而Tick能插入成功是因为事务没有生效。如果是前者抛出异常前者不会回滚后者需要看无事务方法是否已经执行完毕如果已经执行完毕则不会回滚事务方法一旦被执行完毕就会提交。 为何好端端的事务会失效 1Spring的事务注解Transactional只能放在public方法上才起作用 2方法用final或static修饰了用这两个关键字修饰的方法Spring无法对目标方法进行重写因此自然也就不存在事务了 3如果采用springspring mvc则context:component-scan重复扫描问题可能会引起事务失败 4数据库引擎不支持如使用mysql且引擎是MyISAM则事务会不起作用原因是MyISAM不支持事务可以改成InnoDB引擎 5本类中的方法互相调用不会经过Spring的代理类所以如果在调用方法前没有事务控制的话调用后也是没有的Spring事务是通过AOP代理来实现的。 3.3事务超时时间 timeout属性默认是-1不超时在实际生产环境中一般设置为30秒、60秒注意这个时间是所有事务的执行时间综合。 Transactional(propagation Propagation.REQUIRED, timeout 5) public int insertDishDefault() {MapString, Object paramMap new HashMap();...try {Thread.sleep(6000); //让线程暂停6秒而事务的回滚时间阈值是5秒} catch (InterruptedException e) {throw new RuntimeException(e);}int result dishMapper.insertDishDefault(paramMap); // 插入失败return result; }3.4事务隔离级别 isolation属性默认是-1表示使用数据库的隔离级别用一个实验来测试隔离性如下面代码所示该查询方法可以查看未提交的事务。 Transactional(isolation Isolation.READ_UNCOMMITTED) public String selectDishDefault(String dishId) {Dish dish dishMapper.selectDishDefault(dishId);if (dish null) {return 没有该用户;} else {return JsonUtil.objectToJson(dish);} }在第一行打上断点然后执行一个sql插入语句不提交实际证明该方法可以读取到我们没提交的这个sqlSession中的数据可以用datagrip来手动提交事务 3.5事务回滚条件 rollbackFor属性默认是空表示捕获所有异常。指定了异常种类后只有在出现了指定的异常才会回滚。 Transactional(propagation Propagation.REQUIRED, rollbackFor DataAccessException.class) public int insertDishDefault() {MapString, Object paramMap new HashMap();...int result dishMapper.insertDishDefault(paramMap);try {int i 1/0; // 会抛出ArithmeticException异常但不是回滚的异常条件数据插入成功} catch (ArithmeticException e) {e.printStackTrace();}return result; }
http://www.w-s-a.com/news/94480/

相关文章:

  • 苏州尚云网站建设专业摄影网站推荐
  • 020网站开发微信公众号直接链接网站怎么做
  • 学做烘焙的网站某网站注册需要邮箱是怎么弄
  • 网站的特效代码公司网站开发的工作内容
  • 网站制作哪家好商城网站建设预算要多少钱
  • 怎么做律所的官方网站微网站可以做商城吗
  • 通用网站后台管理系统(php版)网站备案ip查询网站查询
  • 制作网站代码吗江阴网站建设推广
  • 汕头建网站wordpress文章网址采集
  • 十大景观设计网站用vue框架做的网站
  • 福建省建设监理网官方网站做外贸网站卖什么东西好
  • 公司做网站排名东莞关键词优化推广
  • 连云港做企业网站公司全网营销与seo
  • 电子毕业设计代做网站wordpress 插件放在那
  • 黄石规划建设局网站怎么做存储网站
  • 网站安装wordpress滨江网站建设
  • 河南官网网站建设一般使用的分辨率显示密度是
  • dedecms新网站 上传到万网的空间宝洁公司网站做的怎么样
  • 网站建设语录优惠券的网站怎么做的
  • 白山市住房和建设局网站有实力高端网站设计地址
  • 沧州网站建设制作设计优化深圳网站自然优化
  • 企业做网站 乐云seowordpress中修改html
  • 网站细节门户wordpress主题下载
  • 全景网站模版wordpress套餐
  • 华为云建网站dw制作一个手机网站模板
  • 定陶菏泽网站建设河北新出现的传染病
  • 商业网站建设案例教程郑州服装网站建设公司
  • 网站内容怎么做专业的企业管理软件
  • 深圳网站制作公司排名微网站和微信公共平台的区别
  • 权威的唐山网站建设扁平网站欣赏