9 Spring学习:Spring事务管理

事务事务定义事务是正确执行一系列的操作(或动作) , 使得数据库从一种状态转换成另一种状态 , 且保证操作全部成功 , 或者全部失败 。我们知道在JAVAEE的开发过程中 , service层的方法通常用于业务逻辑处理 , 而业务往往涉及到对数据库的多个操作 。
【9 Spring学习:Spring事务管理】以生活中常见的转账为例 , 假设某个方法要实现将A账户转账到B账户的功能 , 则该方法内必定有两个操作:先将A账户的金额减去要转账的数目 , 然后将B账户加上相应的金额数目 , 这个方法看似简单 , 但是需要这两个操作要么全部成功(表示本次转账成功);若有任意一方失败 , 则另一方必须回滚(即必须回到初始状态 , 全部失败) 。所以上面介绍的事务其实就是指:一组操作是不可分割的 , 要么全部成功 , 要么全部失败 。
事务的ACID四个特性我们知道事务具有ACID四个特性:原子性、一致性、隔离性和持久性 。
原子性(Atomicity):事务是一个不可分割的工作单位 , 事务中的操作要么都发生 , 要么都不发生;一致性(Consistency):事务在完成后数据的完整性必须保持一致;隔离性(Isolation):多个用户并发访问数据库时 , 一个用户的事务不能被其他用户的事务所干扰 , 多个并发事务之间的数据要相互隔离;持久性(Durability):一个事务一旦被提交 , 它对数据库中数据的改变应该是永久性的 , 即使数据库发生故障也不应该对其有任何影响 。
Java事务Java事务其实是以Java编写的程序或系统 , 用于实现ACID的操作 。而Java事务的实现是通过JDBC提供的相应方法来间接实现对数据库的增删改查操作 , 通过事务转移到Java程序代码中进行控制 。
需要注意的是必须确保事务要么全部执行成功 , 要么撤销不执行 。因此可以这么说Java事务机制和原理就是操作确保数据库操作的ACID特性 。
Java事务的类型分为三种:JDBC事务、JTA(Java Transaction API)事务和容器事务 。其中JDBC事务是用Connection对象控制的手动模式和自动模式;JTA事务是与实现无关的 , 与协议无关的API;容器事务是应用服务器提供的 , 且大多数是基于JTA完成(通常是基于JNDI(Java Naming and Directory Interface,Java命名和目录接口)的 , 一种非常复杂的API实现) 。
三种事务的差异:JDBC事务 , 它控制的局限性在一个数据库连接内 , 但是其使用较为简单 。JTA(Java Transaction API)事务 , 它功能强大 , 可跨越多个数据库或者多个DAO , 但是使用起来较为复杂;容器事务 , 主要指的是J2EE应用服务器提供的事务管理 , 局限于EJB应用使用 。
Spring事务管理接口先来看一张图 , 该图反映了事务在Spring中占据着较为核心的位置:

9 Spring学习:Spring事务管理

文章插图
 
而下面这张图则是Spring事务管理提供的三个高层抽象接口 , 分别是TransactionProxyFactoryBean , TransactionDefinition , TransactionStatus
9 Spring学习:Spring事务管理

文章插图
 
PlatformTransactionManager事务管理器Spring事务管理器的接口是org.springframework.transaction.PlatformTransactionManager , Spring框架并不直接管理事务 , 而是通过该接口为不同的持久层框架提供了不同的PlatformTransactionManager接口实现类 , 也就是将事务管理的职责委托给Hibernate或者Mybatis等持久层框架的事务来实现 。
org.springframework.jdbc.datasource.DataSourceTransactionManager:使用JDBC或者Mybatis进行持久化数据时使用 , 通过调用java.sql.Connection来管理事务 。
org.springframework.orm.hibernate5.HibernateTransactionManager:使用hibernate5版本进行持久化数据时使用 , 将事务管理的职责委托给org.hibernate.Transaction对象来管理事务 , 而后者是从Hibernate Session中获取到的 。
org.springframework.orm.jpa.JpaTransactionManager:使用JPA进行持久化数据时使用 , 通过一个JPA实体管理工厂(javax.persitence.EntityManagerFactory接口的任意实现)将与工厂所产生的JPA EntityManager合作来构建事务 。
org.springframework.jdo.JdoTransactionManager:当持久化机制是jdo时使用 。


推荐阅读