Spring事务框架之TransactionStatus源码解析

 更新时间:2023年08月29日 11:39:48   作者:福  
这篇文章主要为大家介绍了Spring事务框架之TransactionStatus源码示例解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

Java技术迷

Spring事务框架

本文来分析TransactionStatus。

用来记录事务执行过程中的状态的,最终决定该事务能否提交、是否需要回滚等。

先来看一下TransactionStatus的类结构:

TransactionStatus

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public interface TransactionStatus extends TransactionExecution, SavepointManager, Flushable{
/**
     * Return whether this transaction internally carries a savepoint,
     * that is, has been created as nested transaction based on a savepoint.
     * <p>This method is mainly here for diagnostic purposes, alongside
     * {@link #isNewTransaction()}. For programmatic handling of custom
     * savepoints, use the operations provided by {@link SavepointManager}.
     * @see #isNewTransaction()
     * @see #createSavepoint()
     * @see #rollbackToSavepoint(Object)
     * @see #releaseSavepoint(Object)
     */
boolean hasSavepoint();
Flush the underlying session to the datastore, if applicable: for example, all affected Hibernate/JPA sessions.
This is effectively just a hint and may be a no-op if the underlying transaction manager does not have a flush concept. A flush signal may get applied to the primary resource or to transaction synchronizations, depending on the underlying resource.
@Override
void flush();
}

他只定义了两个方法:

  • hasSavepoint:返回这个事务是否包含了savepoint,也就是说,是否基于嵌套事务创建了一个savepoint。savepoint的概念前面的文章已经分析过。
  • flush:这个应该是和Hibernate或JPA相关的,具体作用暂时不管了,不研究Hibernate相关的东西。

没了。

但是,这个接口继承了3个接口:TransactionExecution, SavepointManager, Flushable,我们简单看一眼:

TransactionExecution

这个接口很简单,是事务状态的一个通用接口,定义了当前事务是否是一个新事务的获取方法、设置当前事务为回滚状态、获取事务是否已经完成的方法等。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
/**
 * Common representation of the current state of a transaction.
 * Serves as base interface for {@link TransactionStatus} as well as
 * {@link ReactiveTransaction}.
 *
 * @author Juergen Hoeller
 * @since 5.2
 */
public interface TransactionExecution {
    /**
     * Return whether the present transaction is new; otherwise participating
     * in an existing transaction, or potentially not running in an actual
     * transaction in the first place.
     */
    boolean isNewTransaction();
    /**
     * Set the transaction rollback-only. This instructs the transaction manager
     * that the only possible outcome of the transaction may be a rollback, as
     * alternative to throwing an exception which would in turn trigger a rollback.
     */
    void setRollbackOnly();
    /**
     * Return whether the transaction has been marked as rollback-only
     * (either by the application or by the transaction infrastructure).
     */
    boolean isRollbackOnly();
    /**
     * Return whether this transaction is completed, that is,
     * whether it has already been committed or rolled back.
     */
    boolean isCompleted();
}

SavepointManager

提供3个方法:创建保存点、回滚到保存点、释放保存点。

1
2
3
Object createSavepoint() throws TransactionException;
void rollbackToSavepoint(Object savepoint) throws TransactionException;
void releaseSavepoint(Object savepoint) throws TransactionException;

Flushable

不说了,就是上面的那个flush方法。

AbstactTransactionStatus & DefaultTransactionStatus

AbstactTransactionStatus持有事务的几个重要状态,业务执行后,Spring事务管理器需要通过状态判断事务是提交或者是回滚。

1
2
3
4
private boolean rollbackOnly = false;
    private boolean completed = false;
    @Nullable
    private Object savepoint;

Spring事务管理机制中TransactionStatus的最终落地实现是DefaultTransactionStatus,代码就不贴出了,比较简单。

其实我们通过对TransactioStatus的分析能够得出一个结论,那就是有savepoint的事务的回滚是通过TransactionStatus实现的。

TransactionStatus持有事务对象transaction,事务保存点savepoint是保存在transaction中,最终通过调用transaction的rollbackToSavepoint回滚事务到存储点。

好了,TransactionStatus就分析到这儿。

以上就是Spring事务框架之TransactionStatus的详细内容,更多关于Spring事务TransactionStatus的资料请关注脚本之家其它相关文章!

蓄力AI

微信公众号搜索 “ 脚本之家 ” ,选择关注

程序猿的那些事、送书等活动等着你

原文链接:https://segmentfault.com/a/1190000042796288

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权/违法违规/事实不符,请将相关资料发送至 reterry123@163.com 进行投诉反馈,一经查实,立即处理!

相关文章

  • Java生成二维码的实例代码

    Java生成二维码的实例代码

    这篇文章主要介绍了Java生成二维码的实例代码,帮助大家更好的理解和使用Java,感兴趣的朋友可以了解下
    2020-09-09
  • Java中BigDecimal除法使用不当导致精度问题

    Java中BigDecimal除法使用不当导致精度问题

    本文主要介绍了Java中BigDecimal除法使用不当导致精度问题,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-11-11
  • Spring中实现的三种异步流式接口方法

    Spring中实现的三种异步流式接口方法

    在现代Web开发中,接口超时是一个常见的问题,尤其是在处理耗时操作时,传统的同步接口在处理长时间任务时会阻塞请求线程,从而影响系统的响应能力,本文将详细讲解Spring中实现的三种异步流式接口方法,需要的朋友可以参考下
    2024-10-10
  • mybatisplus自动填充属性值的实现步骤

    mybatisplus自动填充属性值的实现步骤

    MyBatis-Plus提供自动填充的功能,帮助自定设置这些字段的值,提升开发效率,本文就来介绍一下如何使用,感兴趣的可以了解一下
    2023-12-12
  • SpringCloud如何创建一个服务提供者provider

    SpringCloud如何创建一个服务提供者provider

    这篇文章主要介绍了SpringCloud如何创建一个服务提供者provider,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-07-07
  • SpringBoot集成QQ第三方登陆的实现

    SpringBoot集成QQ第三方登陆的实现

    这篇文章主要介绍了SpringBoot集成QQ第三方登陆的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-11-11
  • Java ArrayList与LinkedList使用方法详解

    Java ArrayList与LinkedList使用方法详解

    Java中容器对象主要用来存储其他对象,根据实现原理不同,主要有3类常用的容器对象:ArrayList使用数组结构存储容器中的元素、LinkedList使用链表结构存储容器中的元素
    2022-11-11
  • java多线程编程实现下雪效果

    java多线程编程实现下雪效果

    这篇文章主要介绍了java多线程编程实现下雪效果的相关资料,需要的朋友可以参考下
    2015-11-11
  • Java Mybatis框架由浅入深全解析下篇

    Java Mybatis框架由浅入深全解析下篇

    MyBatis是一个优秀的持久层框架,它对jdbc的操作数据库的过程进行封装,使开发者只需要关注SQL本身,而不需要花费精力去处理例如注册驱动、创建connection、创建statement、手动设置参数、结果集检索等jdbc繁杂的过程代码,本文将作为最终篇为大家介绍MyBatis的使用
    2022-07-07
  • 简述Java中的四种引用类型

    简述Java中的四种引用类型

    从JDK1.2版本开始,把对象的引用分为四种级别,从而使程序能更加灵活的控制对象的生命周期。这四种级别由高到低依次为:强引用、软引用、弱引用和虚引用,下面分别介绍下这四种引用。
    2021-04-04

最新评论