·Java事务导引
事务简介
-
-
·什么是事务
- -事务是正确执行一系列的操作(或动作),使得数据库从一种状态转换成另一种状态,且保证操作全部成功,或者全部失败。
-
·事务原则是什么
- -事务必须服从ISO/IEC所制定的ACID原则。
- -ACID原则的具体内涵如下:
- ·原子性(Atomicity):
-即不可分割性,事务要么全部被执行,要么就全部不被执行。
·一致性(Consistency):
-事务的执行使得数据库从一种正确状态转换成另一种正确状态。
·隔离性(Isolation):
-在事务正确提交之前,它可能的结果不应显示给任何其他事务。
·持久性(Durability):
-事务正确提交后,其结果将永久保存在数据库中。
- ·原子性(Atomicity):
-
Java事务
-
- ·Java事务的产生
- -程序操作数据库的需要。以Java编写的程序或系统,实现ACID的操作。
- ·Java事务实现
- -通过JDBC相应方法间接来实现对数据库的增、删、改、查,把事务转移到Java程序代码中进行控制;
- -确保事务一要么全部执行成功,要么撤销不执行。
- ·总结:Java事务机制和原理就是操作确保数据库操作的ACID特性。
- ·Java事务的产生
Java事务实现模式
-
- ·Java事务的实现
- -通过Java代码来实现对数据库的事务性操作。
- ·Java事务类型
- -JDBC事务:用Connection对象控制的手动模式和自动模式;
- -JTA(Java Transaction API)事务:与实现无关的,与协议无关的API;
- -容器事务:应用服务器提供的,且大多是基于JTA完成(通常基于JNDI的,相当复杂的API实现)。
- ·三种事务的差异
- ·JDBC事务:控制的局限性在一个数据库连接内,但是其使用简单。·
- JTA事务:功能强大,可跨越多个数据库或多DAO,使用比较复杂。·
- 容器事务:主要指的是J2EE应用服务器提供的事务管理,局限于EJB应用使用。
- ·Java事务的实现
·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。