Spring--事务管理

·Java事务导引

事务简介

    • ·什么是事务

      • -事务是正确执行一系列的操作(或动作),使得数据库从一种状态转换成另一种状态,且保证操作全部成功,或者全部失败
    • ·事务原则是什么

      • -事务必须服从ISO/IEC所制定的ACID原则。
      • -ACID原则的具体内涵如下:
        • ·原子性(Atomicity):
          -即不可分割性,事务要么全部被执行,要么就全部不被执行。
          ·一致性(Consistency):
          -事务的执行使得数据库从一种正确状态转换成另一种正确状态。
          ·隔离性(Isolation):
          -在事务正确提交之前,它可能的结果不应显示给任何其他事务。
          ·持久性(Durability):
          -事务正确提交后,其结果将永久保存在数据库中。

Java事务

    • ·Java事务的产生
      • -程序操作数据库的需要。以Java编写的程序或系统,实现ACID的操作。
    • ·Java事务实现
      • -通过JDBC相应方法间接来实现对数据库的增、删、改、查,把事务转移到Java程序代码中进行控制;
      • -确保事务一要么全部执行成功,要么撤销不执行。
    • ·总结:Java事务机制和原理就是操作确保数据库操作的ACID特性。

Java事务实现模式

    • ·Java事务的实现
      • -通过Java代码来实现对数据库的事务性操作。
    • ·Java事务类型
      • -JDBC事务:用Connection对象控制的手动模式和自动模式;
      • -JTA(Java Transaction API)事务:与实现无关的,与协议无关的API;
      • -容器事务:应用服务器提供的,且大多是基于JTA完成(通常基于JNDI的,相当复杂的API实现)。
    • ·三种事务的差异
      • ·JDBC事务:控制的局限性在一个数据库连接内,但是其使用简单。·
      • JTA事务:功能强大,可跨越多个数据库或多DAO,使用比较复杂。·
      • 容器事务:主要指的是J2EE应用服务器提供的事务管理,局限于EJB应用使用。

·Spring事务核心接口

事务接口架构

 

Spring事务管理器

  • ·JDBC事务管理器(DataSourceTransactionManager)
    • -本事务管理器是通过调用java.sql.Connection来管理事务。
  • ·Hibernate事务管理器(Hibernate TransactionManager)
    • -本管理器将事务管理的职责委托给org.hibernate.Transaction对象来管理事务,而后者是从Hibernate Session中获取到的。
  • ·JPA事务管理器(JpaTransactionManager)
    • -通过一个JPA实体管理工厂
    • (javax.persistence.EntityManagerFactory接口的任意实现)将与由工厂所产生的JPA EntityManager合作来构建事务。
  • ·JTA事务管理器(JtaTransactionManager)
    • -本管理器将将事务管理的责任委托给
    • javax.transaction.UserTransaction和javax.transaction.TransactionManager对象进行事务处理。

Spring事务属性

 

Spring事务传播行为

    -当事务方法被另一个事务方法调用时,必须指定事务应该如何传播;

     -Spring的7中传播行为

    

 

 

Spring事务隔离级别

    -隔离级别定义了一个事务可能受其他并发事务影响的程度。
     -隔离级别分为:

    

 

Spring事务中注意的问题

·事务是否只读
  -利用数据库事务的“只读”属性,进行特定优化处理。
·注意:
  -事务的是否“只读”属性,不同的数据库厂商支持不同。
  -通常而言:只读属性的应用要参考厂商的具体支持说明,比如,Oracle的“readOnly”不起作用,不影响其增删改查;Mysql的“readOnly"为true,只能查,增删改则出异常。

    ·事务超时
      -事务超时就是事务的一个定时器,在特定时间内事务如果没有执行完毕,那么就会自动回滚,而不是一直等待其结束。
    ·设计事务时注意点:
      -为了使应用程序很好地运行,事务不能运行太长的时间。因为事务可能涉及对后端数据库的锁定,所以长时间的事务会不必要的占用数据库资源。

    ·事务回滚
      -默认情况下,事务只有遇到运行期异常时才会回滚,而在遇到检查型异常时不会回滚。
    ·自定义回滚策略:
      -声明事务在遇到特定的检查型异常时像遇到运行期异常那样回滚;
      -声明事务遇到特定的异常不回滚,即使这些异常是运行期异常。

Spring事务状态

    ·事务接口
      -通过事务管理器获取TransactionStatus实例;
      -控制事务在回滚或提交的时候需要应用对应的事务状态;
      -Spring事务接口:


·编程式事务管理

  编程式事务实现方式

·模板事务(TransactionTemplate)的方式
  
-此为Spring官方团队推荐的编程式事务管理方式;
  -主要工具为JdbcTemplate类。
·平台事务管理器(PlatformTransactionManager)方式
 
 -类似应用JTA UserTransaction API方式,但异常处理更简洁;
       -辅助类为:TransactionDefinition和TransactionStatus。

  编程式事务实现案例

·模板事务(TransactionTemplate)案例
  
-步骤:获取模板对象;选择事务结果类型;业务数据操作处理。
·平台事务管理器(PlatformTransactionManager)案例
 
 -步骤:获取事务管理器;获取事务属性对象;获取事务状态对象;创建JDBC模板对象;业务数据操作处理。

  编程事务总结

·需要有效的数据源,具体数据源根据实际情况创建
·创建编程事务管理对象:
 
 -事务模板(TransactionTemplate)
  -事务管理器(PlateformTransactionManager)
·业务逻辑处理
  
-基于JdbcTemplate完成业务处理。

·声明式事务管理

  声明式事务实现方式

·声明式事务管理的配置类型:
  
-5种类型:独立代理;共享代理;拦截器;tx拦截器;全注释。

·声明式事务管理配置实现方式:
  
-5种类型的配置实现参考(配置代码案例)

·总结

  编程事务管理和声明事务管理区别

·编程式事务允许用户在代码中精确定义事务的边界;
·声明式事务有助于用户将操作与事务规则进行解耦
  
-基于AOP交由Spring容器实现;
  -实现关注点聚焦在业务逻辑上。
·概括而言:
  
-编程式事务侵入到了业务代码里面,但是提供了更加详细的事务管理;而声明式事务由于基于AOP,所以既能起到事务管理的作用,又可以不影响业务代码的具体实现。

  两种事务的选择

·小型应用、事务操作少:
  
-建议编程式事务管理实现:Transaction Template;
  -简单、显式操作、直观明显、可以设置事务名称。
·大型应用,事务操作量多:
  
-业务复杂度高、关联性紧密,建议声明式事务管理实现;
  -关注点聚焦到业务层面,实现业务和事务的解耦。

  声明式事务实现方式

·事务管理器类型
  
-基于不同的数据源选择对应的事务管理器;
  -选择正确的PlatformTransactionManager实现类;
  -全局事务的选择:JtaTransactionManager。

posted @ 2018-09-06 14:02  windbag7  阅读(222)  评论(0编辑  收藏  举报