前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Spring 框架学习(十)---- 声明式事务管理

Spring 框架学习(十)---- 声明式事务管理

作者头像
RAIN7
发布2022-07-09 13:06:20
3180
发布2022-07-09 13:06:20
举报
文章被收录于专栏:RAIN7 de 编程之路

文章目录

Spring 框架学习(十)---- 声明式事务管理

一、事务介绍

简单介绍一下事务

也不去系统的说概念了,以自己理解的为主

就是多个操作打包成为一个事务,成为原子性的操作

总结

要么都成功,要么都失败

再举一个例子

我去ATM机 用自己卡里的钱 给别人的卡 转账

转账之后 我的银行卡里钱减少,对方的银行卡前增加,这是正常的,这是一个业务,且必须保证原子性

来个反例

转账的时候,点击转账,突然中间过程卡了一下出现异常了,我在去查看,发现我的钱减少了,对方的钱没变,中间的过程出现异常没有执行对方账户前增加的操作,这样银行就乱套了。

二、Spring-Mybatis 使用事务

0、前置准备工作

spring 的环境jar包

代码语言:javascript
复制
    <dependencies>
        <!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>5.3.18</version>
        </dependency>

spring-tx 事务的jar包

代码语言:javascript
复制
    <!-- https://mvnrepository.com/artifact/org.springframework/spring-tx -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-tx</artifactId>
        <version>5.3.21</version>
    </dependency>

spring-jdbc 操作数据库的jar包

代码语言:javascript
复制
    <!--        Spring连接数据库的话需要jdbc-->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-jdbc</artifactId>
        <version>5.3.13</version>
    </dependency>

mysql驱动包

代码语言:javascript
复制
        <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.16</version>
        </dependency>

mybatis 的jar包

代码语言:javascript
复制
       <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.6</version>
        </dependency>

mybtais-spring 的jar包

代码语言:javascript
复制
    <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis-spring -->
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis-spring</artifactId>
        <version>2.0.7</version>
    </dependency>

spring-sonfig 文件中加入各种xml约束

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        https://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/aop
        https://www.springframework.org/schema/aop/spring-aop.xsd
        http://www.springframework.org/schema/tx
        https://www.springframework.org/schema/tx/spring-tx.xsd ">


<!--    数据源一般是固定代码-->
    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://127.0.0.1:3306/mybatis?useUnicode=true&amp;characterEncoding=utf-8&amp;serverTimezone=GMT"/>
        <property name="username" value="root"/>
        <property name="password" value="123456"/>
    </bean>

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!--     完全替代了配置文件-->
    <property name="dataSource" ref="dataSource" />
    <property name="mapperLocations" value="classpath:com/bit/mapper/UserMapper.xml"/>
</bean>


    <bean id="userMapperImpl" class="com.bit.mapper.UserMapperImpl" >
<!--        实现类的父类daoSupport需要注入sqlSessionFactory,然后daoSupport的作用就和SqlSession差不多,不需要sqlSession注入以及装配了-->
        <property name="sqlSessionFactory" ref="sqlSessionFactory"/>
    </bean>

    <!--开启aop注解的支持 -->
    <aop:aspectj-autoproxy />
    

    <!--在aop:config 中配置切面、切点、以及各种通知 或者使用注解配置即可-->



<!--    开启组件注解支持-->
    <context:annotation-config/>
<!--    开启包路径注解扫描-->
    <context:component-scan base-package="com.*"/>
</beans>

1、声明式事务(xml配置)

(1)首先在spring的核心配置文件中加入 DataSourceTransactionManage 对象

数据源和SqlSession什么的都得提前搞好!

代码语言:javascript
复制
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
  <constructor-arg ref="dataSource" />
</bean>

(2)定义事务的各种通知(应用的方法名字,通知的传播级别),使用aop将通知应用在切入点对应的方法中

代码语言:javascript
复制
<!--    定义事务的各种通知,传播特性,应用的方法名字-->
    <tx:advice id="txAdvice" transaction-manager="DataSourceTransactionManage">
        <tx:attributes>
            <tx:method name="method" propagation="REQUIRED"/>
        </tx:attributes>
    </tx:advice>

    <!--在aop:config 中配置切面、切点、以及各种通知 或者使用注解配置即可-->
<aop:config>
    <aop:pointcut id="pointcut" expression="execution(* com.bit.mapper.UserMapperImpl.method(..))"/>
    <aop:advisor advice-ref="txAdvice" pointcut-ref="pointcut"/>
</aop:config>

propagation 代表传播级别

事务的传播级别我们在后面还会用到,暂时不会那么深入,只需要用Required即可,如果存在一个事务,则支持当前事务。

如果是查找的方法,可以将read-only 属性设置为true,不允许支持修改操作,只支持读的操作

(3)在使用方法的时候,那么如果方法中又多个修改数据库的操作,那么要么都成功,要么都失败(一个失败事务回滚所有操作全部取消)

2、注解开发使用事务

(1)加入事务注解开发的支持

代码语言:javascript
复制
<tx:annotation-driven transaction-manager="DataSourceTransactionManage" />

(2)直接在需要事务的方法上面加上 @Transactional即可,同时定义事务的各种属性

三、事务相关的xml配置模板

集成了spring环境、aop支持、事务支持、spring数据源、事务管理器、各种注解支持、各种组件扫描等等

有很多内容可以使用注解替代。。。

xml约束全部补齐

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        https://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/aop
        https://www.springframework.org/schema/aop/spring-aop.xsd
    http://www.springframework.org/schema/tx
    https://www.springframework.org/schema/tx/spring-tx.xsd ">


<!--    数据源一般是固定代码-->
    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://127.0.0.1:3306/mybatis?useUnicode=true&amp;characterEncoding=utf-8&amp;serverTimezone=GMT"/>
        <property name="username" value="root"/>
        <property name="password" value="123456"/>
    </bean>

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!--     完全替代了配置文件-->
    <property name="dataSource" ref="dataSource" />
    <property name="mapperLocations" value="classpath:com/bit/mapper/UserMapper.xml"/>
</bean>


    <bean id="userMapperImpl" class="com.bit.mapper.UserMapperImpl" >
<!--        实现类的父类daoSupport需要注入sqlSessionFactory,然后daoSupport的作用就和SqlSession差不多,不需要sqlSession注入以及装配了-->
        <property name="sqlSessionFactory" ref="sqlSessionFactory"/>
    </bean>



<!-- 配置事务管理器,使用spring提供的-->
    <bean id="DataSourceTransactionManage" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"/>
    </bean>

<!--    定义事务的各种通知,传播特性,应用的方法名字-->
    <tx:advice id="txAdvice" transaction-manager="DataSourceTransactionManage">
        <tx:attributes>
            <tx:method name="method" propagation="REQUIRED"/>
        </tx:attributes>
    </tx:advice>

    <!--在aop:config 中配置切面、切点、以及各种通知 或者使用注解配置即可-->
<aop:config>
    <aop:pointcut id="pointcut" expression="execution(* com.bit.mapper.UserMapperImpl.method(..))"/>
    <aop:advisor advice-ref="txAdvice" pointcut-ref="pointcut"/>
</aop:config>


<!--开启aop注解的支持 -->
    <aop:aspectj-autoproxy />

<!--    加入事务注解开发的支持-->
<tx:annotation-driven transaction-manager="DataSourceTransactionManage" />

<!--    开启组件注解支持-->
    <context:annotation-config/>

<!--    开启包路径注解扫描-->
    <context:component-scan base-package="com.*"/>
</beans>
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-07-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 文章目录
  • Spring 框架学习(十)---- 声明式事务管理
  • 一、事务介绍
  • 二、Spring-Mybatis 使用事务
    • 0、前置准备工作
      • 1、声明式事务(xml配置)
        • 2、注解开发使用事务
        • 三、事务相关的xml配置模板
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档