Spring事务管理核心讲解包含代码示例和源码解析(Annotation)

本文介绍了Spring事务管理的三大核心接口PlatformTransactionManager、TransactionDefinition和TransactionStatus,以及如何通过XML和注解实现声明式事务管理。通过ACID原则理解事务的重要性,详细讲解了PlatformTransactionManager的三个关键方法。文章还探讨了不同事务传播行为的含义,并提供了基于XML和注解的事务配置示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

开篇

🚁如果还不清楚事务是干什么的,可以先去了解一下,这里简单解释:
我希望做这件事要成功就一起成功,要失败就一起失败,不要成功一半

看完本篇博文将掌握:

  • spring事务管理3个核心接口
  • 了解到spring事务管理的两种方式
  • 掌握基于xml配置文件和Annotation声明式事务的使用方式

🙋‍♀️ACID原则

  • 原子性
  • 一致性
  • 隔离性
  • 持久性

spring事务管理

1、事务管理的核心接口包位置和3个核心接口
在这里插入图片描述

PlatformTransactionManager

这个接口是spring提供的事务管理器,主要用户管理事务
在这里插入图片描述
它只有3个方法:

1️⃣

TransactionStatus getTransaction(@Nullable TransactionDefinition definition)
			throws TransactionException;

用来获取事务状态信息:Return a currently active transaction or create a new one, according to the specified propagation behavior.

2️⃣

void commit(TransactionStatus status) throws TransactionException;

用来提交事务

3️⃣

void rollback(TransactionStatus status) throws TransactionException;

回滚事务

在这里插入图片描述
我们熟悉的JDBC就是它的一个实现类之一
还有Hibernate事务管理器、全局事务管理器

这个接口十分的重要,它是所有的具体持久层技术的核心之一,当底层采用不同的持久层技术时,系统只需要使用不同的PlatformTransactionManager实现类即可

TransactionDefinition

Interface that defines Spring-compliant transaction properties.
该接口是事务定义(描述)的对象,其中定义了事务规则,并提供了获取事务相关信息的方法
在这里插入图片描述
可能会有疑惑的地方,这里先说事务传播🕵️‍♀️
在这里插入图片描述
在这里的REQUIRED就是属于一种“传播行为”,表示当前方法必须运行在一个事务环境中,如果当前方法已经处于了一个事务环境中了,则肯定就直接使用这个方法,否则会开启另一个新的事务!它也是spring默认的传播行为
在这里插入图片描述
其实上面的几个传播行为种类也很好理解,这里就举几个例子
比如:
Support:就是如果当前的方法处于事务环境中,则使用当前事务,否则就不适用
Never:不支持当前的事务,如果使用了,则会抛异常

所以这个接口类,可以控制是否需要创建事务以及如何创建事务,简单的查询一般用不上事务,但是对于增删改,必须要进行事务管理spring默认的传播行为REQUIRED

TransactionStatus

最后一个核心接口,这个接口是事务状态的描述,它的方法也不多:
在这里插入图片描述
好像根据不同的版本的包,里面的方法不一致,4.6版本好像有6个方法,我这里是5.3.15版本,只有两个方法:

  • hasSavepoint()表示获取是否存在的点
  • flush()表示刷新事务

spring事务管理类型

  • 声明式事务:通过AOP技术实现的事务管理
  • 编程式事务:需要在代码中,进行事务的管理,这里就包括了你要定义事务的开始、正常执行过程、以及事务的提交和异常事务回滚等,比较麻烦(现在不常用,一般用声明式事务)

声明式事务

实现方法:

  • 基于XML
  • 基于Annotation

基于XML

在spring中配置文件中和事务有关配置总是由3个部分组成:
1、dataSource
2、TransactionManager
3、代理机制

一般来说变化的只是代理机制而已,前面两个只会根据数据访问方式而变化💜

想要看一些例子的话,这里有几班过路车:
快上车,Spring快速整合Mybatis实现方法一
二班车,Spring快速整合Mybatis实现方法二(SqlSessionDaoSupport +事务处理)

点击查看本专栏,还有后面几班车,就不一 一展示了

基于Annotation注解方式

这个方式应该是现阶段比较流行的一种方式,这个方式比在xml中配置简单不少,这里只是简单演示

步骤如下:
1、配置声明事务

<!--    1、配置声明式事务-->
    <tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true" />

    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<!--        <constructor-arg ref="dataSource" />-->
        <property name="dataSource" ref="dataSource"/>
    </bean>

2、直接在想要配置事务的方法上方,添加@Transactional注解即可
以下的例子来自二班车噢🙌

    @Override
    @Transactional
    public List<User> select() {
        User user = new User(6, "小明", "846328");
        UserMapper mapper = getSqlSession().getMapper(UserMapper.class);
        mapper.addUser(user);
        mapper.delete(6);
        return mapper.select();
        // return getSqlSession().getMapper(UserMapper.class).select();
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我是X大魔王

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值