• 1. Spring声明式事务
  • 2. 本章目标代码的实现4.事务异常处理3.spring事务管理2.了解spring事务1.
  • 3. 事务针对的目的 对于一个软件系统来说,需要相应的数据资源(比如,数据库,文件系统等)来保存系统状态,在对系统状态所依托的数据资源进行访问的时候,为了保证系统始终处于一个“正确”的状态,我们就必须对这些访问操作进行一些必要的限定,以此来保证系统状态的完整性
  • 4. 事务概念 事务就是以可控制的方式对数据资源进行访问的一组操作,为了保证事务执行前后数据资源所承载的系统状态始终处于“正确”状态,事务本身持有四个限定属性,即原子性(Atomictiy),一致性(Consistency),隔离性(Isolation)以及持久性(Durability)
  • 5. 事务的ACID属性 原子性一致性隔离性持久性事物由一个或多个行为捆绑在一起组成,好像是一个单独的工作单位一但一个事物结束了(不管成功与否),系统所处的状态和它的业务规则是一至的事物应该允许多名用户操作同一个数据,一名用户的操作不会和其他用户的操作相混淆一但事物完成,事物的结果应该持久化,这样不管什么样的系统崩溃,他们都将幸免于难
  • 6. Spring对事物的支持DataSource SessionFactory EntityManager Hibernatejpajdbc
  • 7. Spring事务管理1.编程式事务2.声明式事务Spring 提供编程式的事务管理与声明式的事务管理可以清楚地控制事务的边界,也就是让您自行实现事务开始时间,撤销操作的时机,结束时间等,可以实现细粒度的控制事务 spring事务管理相关的API可以不用介入程序之中,从对象的角度来看,它并不知道自己被纳入事务管理之中,在不需要事务管理的时候,只要在设置文件上修改一下设置,即可移去事务管理服务
  • 8. 声明式事务每个bean有一个代理所有Bean共享一个代理基类使用拦截器使用tx标签配置的拦截器全注解声明式事务配置方式
  • 9. 配置文件注解方式管理事务案例
  • 10. java程序注解方式管理事务案例在接口或类的声明处 ,写一个@Transactional.
  • 11. @Transactional常用参数说明 参 数 名 称功 能 描 述readOnly该属性用于设置当前事务是否为只读事务,设置为true表示只读,false则表示可读写,默认值为false。例如:@Transactional(readOnly=true)rollbackFor该属性用于设置需要进行回滚的异常类数组,当方法中抛出指定异常数组中的异常时,则进行事务回滚。 例如:指定单一异常@Transactional(rollbackFor=RuntimeException.class) 指定多个异常类:@Transactional(rollbackFor={RuntimeException.class, Exception.class})rollbackForClassName该属性用于设置需要进行回滚的异常类名称数组,当方法中抛出指定异常名称数组中的异常时,则进行事务回滚。 例如:指定单一异常类名称:@Transactional(rollbackForClassName="RuntimeException") 指定多个异常类名称:@Transactional(rollbackForClassName={"RuntimeException","Exception"})noRollbackFor该属性用于设置不需要进行回滚的异常类数组,当方法中抛出指定异常数组中的异常时,不进行事务回滚。例如:指定单一异常类:@Transactional(noRollbackFor=RuntimeException.class) 指定多个异常类:@Transactional(noRollbackFor={RuntimeException.class, Exception.class})noRollbackForClassName该属性用于设置不需要进行回滚的异常类名称数组,当方法中抛出指定异常名称数组中的异常时,不进行事务回滚。例如:指定单一异常类名称:@Transactional(noRollbackForClassName="RuntimeException") 指定多个异常类名称:@Transactional(noRollbackForClassName={"RuntimeException","Exception"})
  • 12. @Transactional常用参数说明参 数 名 称功 能 描 述propagation该属性用于设置事务的传播行为,例如:@Transactional(propagation=Propagation.NOT_SUPPORTED,readOnly=true)isolation该属性用于设置底层数据库的事务隔离级别,事务隔离级别用于处理多事务并发的情况,通常使用数据库的默认隔离级别即可,基本不需要进行设置timeout该属性用于设置事务的超时秒数,默认值为-1表示永不超时注:事务传播(propagation)及隔离级别(isolation)参数如下图
  • 13. 事务传播行为 传播行为意义备注PROPAGATION_MANDATORY 必须在一个已有的事务中执行,否则抛出异常PROPAGATION_NESTED表示如果当前正有一个事务在运行中,则该方法应当运行在一个嵌套式事务中 被嵌套的事务可以独立于封装事务进行提交或回滚。如果事务不存在,行为就像 PROPAGATION_REQUIRED一样。请注意各厂商对于这种传播行为的支持是参错不齐的PROPAGATION_NEVER必须在一个没有的事务中执行,否则抛出异常(与PROPAGATION_MANDATORY相反)PROPAGATION_NOT_SUPPORTED容器不为这个方法开启事务PROPAGATION_REQUIRED如果有事务, 那么加入事务, 没有的话新建一个(默认情况下)PROPAGATION_REQUIRES_NEW 不管是否存在事务,都创建一个新的事务,原来的挂起,新的执行完毕,继续执行老的事务PROPAGATION_SUPPORTS 如果其他bean调用这个方法,在其他bean中声明事务,那就用事务.如果其他bean没有声明事务,那就不用事务.
  • 14. 事务隔离级别隔离级别含义备注ISOLATION_DEFAULT 使用后端数据库默认的隔离级别 ISOLATION_READ_UNCOMMITTED读取未提交数据(会出现脏读, 不可重复读) 基本不使用ISOLATION_READ_COMMITTED读取已提交数据(会出现不可重复读和幻读) ISOLATION_REPEATABLE_READ可重复读(会出现幻读)ISOLATION_SERIALIIZABLE 串行化
  • 15. 事务注解注意几点123@Transactional 只能被应用到public方法上, 对于其它非public的方法,如果标记了@Transactional也不会报错,但方法没有事务功能.用 spring 事务管理器,由spring来负责数据库的打开,提交,回滚.默认遇到运行期例外(throw new RuntimeException("注释");)会回滚,即遇到不受检查(unchecked)的例外时回滚;而遇到需要捕获的例外(throw new Exception("注释");)不会回滚,Spring团队的建议是你在具体的类(或类的方法)上使用 @Transactional 注解,而不要使用在类所要实现的任何接口上。你当然可以在接口上使用 @Transactional 注解,但是这将只能当你设置了基于接口的代理时它才生效。因为注解是 不能继承 的,这就意味着如果你正在使用基于类的代理时,那么事务的设置将不能被基于类的代理所识别,而且对象也将不会被事务代理所包装(将被确认为严重的)
  • 16. 事务统一异常处理 项目的开发中,不管是对底层的数据库操作过程,还是业务层的处理过程,还是控制层的处理过程,都不可避免会遇到各种可预知的、不可预知的异常需要处理。每个过程都单独处理异常,系统的代码耦合度高,工作量大且不好统一,维护的工作量也很大。 将所有类型的异常处理从各处理过程解耦出来,这样既保证了相关处理过程的功能较单一,也实现了异常信息的统一处理和维护
  • 17. 统一处理异常的3种方式拦截器方式使用Spring MVC提供的简单异常处理器SimpleMappingExceptionResolver自定义方式实现Spring的异常处理接口HandlerExceptionResolver 自定义自己的异常处理器 注解方式 使用@ExceptionHandler注解实现异常处理
  • 18. 异常处理总结拦截方式若只需要简单的集成异常处理,推荐使用SimpleMappingExceptionResolver即可若需要集成的异常处理能够更具个性化,提供给用户更详细的异常信息,推荐自定义实现HandlerExceptionResolver接口的方式自定义方式若不喜欢Spring配置文件或要实现“零配置”,且能接受对原有代码的适当入侵,则建议使用@ExceptionHandler注解方式注解方式上述异常处理3种方式都可以达到统一异常处理的目标,下述可根据不同场景应用不同方式
  • 19. 注解式异常处理 注解式统一处理异常步骤dao层,service层操作数据库方法不需try catch(去掉try catch) 遇见非运行时异常可将异常向上抛出即可,如文件读写流等在BaseController类上设置全局异常处理器@ControllerAdvice增加BaseController类,并在类中使用@ExceptionHandler注解声明异常处理
  • 20. 异常处理2种提交方式1.ajax提交 异常2.普通提交 异常Spring 异常处理又分为ajax提交异常及普通提交异常ajax是异步请求,前台和它是两个不同的操作,不能跳转,只能接收消息,因此ajax请求异常处理可通过打印html.xml或json串的方式将错误的信息反馈前端 普通提交可实现页面跳转,当出现异常,可跳转到错误异常页面
  • 21. 增加BaseController注解方式异常处理案例
  • 22. 判断提交方式注解方式异常处理案例//ajax 请求 if (request.getHeader("accept").indexOf("application/json") > -1|| (request.getHeader("X-Requested-With") != null&& request.getHeader("X-Requested-With").indexOf("XMLHttpRequest") > -1)) { //ajax请求处理代码 }else{ //普通请求处理代码 }
  • 23. ajax提交异常注解方式异常处理案例
  • 24. 普通提交异常注解方式异常处理案例
  • 25. ajax提交异常前端接收注解方式异常处理案例
  • 26. 普通提交异常前端error页面接收注解方式异常处理案例
  • 27. 总结认识事物的本身(目的/概念/属性)spring对事务的支持(jpa事务)spring事务管理(注解式声明式事务)事务的异常处理(注解式异常处理)异常处理案例(全局异常处理器)
  • 28. Thank You !