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

2023-05-16

文章目录

  • 开篇
  • spring事务管理
    • PlatformTransactionManager
    • TransactionDefinition
    • TransactionStatus
  • spring事务管理类型
    • 声明式事务
      • 基于XML
      • 基于Annotation注解方式

开篇

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

看完本篇博文将掌握:

  • 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();
    }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐