博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Spring声明式事务管理之二:核心接口API
阅读量:6345 次
发布时间:2019-06-22

本文共 3781 字,大约阅读时间需要 12 分钟。

hot3.png

1.Spring事务管理API结构

  Spring事务管理API有100个左右,其中最核心的API有3个,分别是TransactionDefinition、   PlatformTransactionManager、TransactionStatus。TransactionDefinition定义事务管理五个属性,PlatformTransactionManager执行具体的事务,TransactionStatus提供控制事务执行和查询事务状态的方法。Spring事务管理主要API结构如下

640?wx_fmt=jpeg&tp=webp&wxfrom=5&wx_lazy=1

2.三个核心API接口源码解析  

   TransactionDefinition接口是用于定义一个事务,它定义了Spring事务管理的五大属性,在上一篇文章中有详细介绍。Spring提供了一个该接口的默认实现类DefaultTransactionDefinition,该类可用于大多数属于管理情况。如果该类不能满足需求,可以通过实现TransactionDefinition接口来定义自己的事务实现。TransactionDefinition接口源码如下:

public interface TransactionDefinition {

    int PROPAGATION_REQUIRED = 0;     int PROPAGATION_SUPPORTS = 1;     int PROPAGATION_MANDATORY = 2;     int PROPAGATION_REQUIRES_NEW = 3;     int PROPAGATION_NOT_SUPPORTED = 4;     int PROPAGATION_NEVER = 5;     int PROPAGATION_NESTED = 6;     int ISOLATION_DEFAULT = -1;     int ISOLATION_READ_UNCOMMITTED = 1;     int ISOLATION_READ_COMMITTED = 2;     int ISOLATION_REPEATABLE_READ = 4;     int ISOLATION_SERIALIZABLE = 8;     int TIMEOUT_DEFAULT = -1;     int getPropagationBehavior();//事务的传播行为     int getIsolationLevel();//事务的隔离级别     int getTimeout();//事务超时时间     boolean isReadOnly();//是否只读     String getName(); }
   PlatformTransactionManager接口用于执行具体的事务,包括获取当前事务状态,提交事务、事务回滚等。
PlatformTransactionManager接口源码如下:
public interface PlatformTransactionManager {   //根据事务定义信息,获得当前状态   TransactionStatus getTransaction(TransactionDefinition var1) throws TransactionException;   //提交事务   void commit(TransactionStatus var1) throws TransactionException;   //回滚事务   void rollback(TransactionStatus var1) throws TransactionException; }
   TransactionStatus接口代表了一个事务本身,提供了一个简单的控制事务执行和查询事务状态的方法。PlatformTransactionManager接口的getTransaction()方法会返回一个TransactionStatus对象,该对象可能代表一个新的或者一个已经存在的事务。
TransactionStatus接口源码如下:
public interface TransactionStatus extends SavepointManager, Flushable {     boolean isNewTransaction();//是否一个新的事务     boolean hasSavepoint();//     void setRollbackOnly();//将事务设置为只能回滚,不允许提交     boolean isRollbackOnly();//查询事务是否已有回滚标志     void flush();     boolean isCompleted();//查询事务是否结束 }

3.三个核心接口之间的关系

   PlatformTransactionManager根据TransactionDefinition定义进行事务管理,管理过程中事务存在多种不同的状态,每个事务状态信息都通过TransactionStatus进行表示。PlatformTransactionManager的默认实现类AbstractPlatformTransactionManager,针对不同的数据库持久化操作技术,又分别有不同的实现类DataSourceTransactionManagerHibernateTransactionManagerJpaTransactionManager三个实现类,还有其他的。

640?wx_fmt=jpeg&tp=webp&wxfrom=5&wx_lazy=1

4.不同平台框架事务管理实现

Spring不直接进行事务管理,而是针对不同的平台提供了多种事务管理器,将事务管理的职责委托给Jdbc、Hibernate、Jpa、iBatis等持久化机制所提供的相关平台框架的事务机制来实现。Spring事务管理的接口是org.springframework.transaction.PlatformTransactionManager,通过这个接口,Spring为各个平台提供了对应的事务管理器,至于具体的实现是各个平台的事情Spring并不关心,这就是 Spring事务管理的一个优点:为不同的平台事务API提供了一致的编程模型。

  • JDBC事务

如果在项目开发中直接使用JDBC来进行持久化操作,DataSourceTransactionManager会用来处理事务边界。DataSourceTransactionManager是通过调用Java.sql.Connection来管理事务,而后者是通过DataSource获取到的。通过调用连接的commit()方法来提交事务,同样,事务失败则通过调用rollback()方法进行回滚。为了使用DataSourceTransactionManager,你需要使用如下的XML将其装配到应用程序的上下文定义中:

   
  • Hibernate事务

如果在实际项目开发中使用Hibernate来实现持久化操作,需要使用HibernateTransactionManager。sessionFactory属性需要装配一个Hibernate的session工厂,HibernateTransactionManager的实现细节是它将事务管理的职责委托给org.hibernate.Transaction对象,而后者是从Hibernate Session中获取到的。当事务成功完成时,HibernateTransactionManager将会调用Transaction对象的commit()方法,反之,将会调用rollback()方法。对于Hibernate3,Hibernate事务的使用需要在Spring的配置文件上下文定义中添加如下<bean>的声明:

 
   
  • Java持久化API事务(JPA)

   如果在实际项目开发中使用JPA来实现持久化操作,那你需要使用Spring的JpaTransactionManager来处理事务。JpaTransactionManager只需要装配一个JPA实体管理工厂(javax.persistence.EntityManagerFactory接口的任意实现)。JpaTransactionManager将与由工厂所产生的JPA EntityManager合作来构建事务。你需要在Spring中如下配置JpaTransactionManager:
 
   

本订阅号提供Java相关技术分享,从Java编程基础到Java高级技术,从JavaWeb技术基础Jsp、Servlet、JDBC到SSH、SSM开发框架,从REST风格接口设计到分布式项目实战。剖析主流开源技术框架,用亲身实践来谱写深度Java技术日志。

640?wx_fmt=jpeg&tp=webp&wxfrom=5&wx_lazy=1

Java技术日志

长按识别二维码,关注Java技术日志

转载于:https://my.oschina.net/u/2362627/blog/868506

你可能感兴趣的文章
java B2B2C Springcloud多租户电子商城系统 (五)springboot整合 beatlsql
查看>>
Throwable是一个怎样的类?
查看>>
Python基础(一)
查看>>
三条代码 搞定 python 生成验证码
查看>>
我的友情链接
查看>>
我的友情链接
查看>>
无线和有线路由哪种性能更好
查看>>
Dwr3.0纯注解(纯Java Code配置)配置与应用浅析三之后端反向调用前端
查看>>
Ubuntu下安装遨游浏览器
查看>>
自定义Linux service脚本
查看>>
微信开发之发红包
查看>>
一键lnmp脚本&&php扩展模块安装(适用于CENTOS6.X系列)
查看>>
二维观察---文字的裁剪
查看>>
矩形覆盖
查看>>
ICMP
查看>>
界面设计模式(第2版)(全彩)
查看>>
解决VMware Workstation错误:未能锁定文件
查看>>
CentOS6 手动编译升级 gcc
查看>>
memcached的安装与开启脚本
查看>>
zabbix 邮件报警 -- sendmail
查看>>