Spring 事务设计与实现

本文深入探讨了Spring事务管理的设计目的和思路,包括编程式和声明式事务、事务管理器、事务传播行为等。Spring旨在简化Java开发,提供统一的事务管理方式,无论底层使用JDBC、JTA还是JPA。同时,文章介绍了Spring如何与ORM框架整合,实现资源与事务的同步以及异常转换。
摘要由CSDN通过智能技术生成

前言

很多人都知道 Spring 包含声明式与编程式两种事务管理方式,通常来说这已经足够日常使用 Spring 事务了。然而,要掌握一门技术,我们还要关心这门技术出现的背景,解决了什么问题,Spring 的事务设计也有其历史原因。

最近回顾 Spring 事务相关知识,发现它的设计还是包含不少内容的,分享给大家,也便于大家更容易理解与掌握 Spring 事务。

Spring 事务管理设计目的

事务是数据库中的基础概念,早在 Spring 诞生之前就已经出现。如果你对事务的概念有所遗忘,可以参考《数据库事务基础知识》 了解更多。

Java 为了操作数据库,提出过 3 个规范,这三个规范都对事务进行了支持。

  1. JDBC:即 Java Database Connectivity,定义了访问数据库的基本操作。参见《Java 基础知识之 JDBC》了解更多。
  2. JTA:即 Java Transaction API,支持本地与全局事务。全局事务即分布式事务,主要使用两阶段提交实现。参见《Java 分布式事务规范 JTA 从入门到精通》了解更多。
  3. JPA:即 Java Persistence API,ORM 框架实现的规范,定义了 Java 类到数据库表之间的映射,可以用面向对象的方式操作数据库,而不用写 SQL,典型的实现是 Hibernate。

Spring 框架的目的是简化 Java 的开发工作,因此面对不同的事务 API,Spring 选择将其整合成一套,这样不管底层的实现是哪一套,都能以统一的方式使用,降低了学习成本。

Spring 事务管理设计思路

Java 中的事务可以简单分为本地事务与全局事务。

本地事务使用单个事务资源,资源通常为关系型数据库,不能跨多个事务资源使用,依赖于 JDBC 或 JPA 规范。

全局事务可以使用多个事务资源,资源可以为关系型数据库或消息队列,依赖于 JTA 规范。然而 JTA 规范要求 EJB 容器对事务管理器进行实现,这就意味着全局事务与 EJB 容器进行绑定。

为了同时支持本地事务与全局事务,Spring 事务的设计参考了 JTA 规范,并且消除或降低了全局事务对 EJB 容器的依赖。

这里总结了 Spring 事务管理的一些细节,它们均参考了 JTA,而非 Spring 首创。

1. 编程式事务与声明式事务

编程式事务以 API 的形式操作事务。事务对象由事务管理器进行管理,通过事务管理器或事务对象提交、回滚事务。事务管理器在 JTA 和 Spring 中的类名都是 TransactionManager,根据使用的 JDBC、JTA、JPA、Hibernate 不同规范或框架,Spring 事务管理器有不同的实现。

JTA 编程式事务伪代码如下:

TransactionManager transactionManager = ...;
transactionManager.begin();
Transaction transaction = transactionManager.getTransaction();
try {
    ...数据库或消息队列操作
    transaction.commit();
} catch (Exception e) {
    transaction.rollback();
}

Spring 编程式事务伪代码如下:

PlatformTransactionManager transactionManager = ...;
TransactionStatus transaction = transactionManager.getTransaction(TransactionDefinition.withDefaults());
try {
    ...数据库或消息队列操作
    transactionManager.commit(transaction);
} catch (Exception e) {
    transactionManager.rollback(transaction);
}

声明式事务在 JTA 中由 EJB 容器实现,主要通过拦截对象方法的执行,在方法执行前后控制事务,并通过 @Transactional 声明事务行为。Spring 声明式事务同样通过 AOP 拦截 bean 方法,并提供了一个同名的 @Transactional 注解声明事务行为。

JTA 声明式事务注解配置示例如下:

@Transactional(value = Transactional.TxType.REQUIRES_NEW,
        rollbackOn = Exception.class,
        dontRollbackOn = RuntimeE
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值