Spring之事务编程概述

news2024/11/25 21:50:29

目录

一:基本概念

搭建测试环境

基于xml声明式事务控制

二:事务相关配置  ​编辑

基于注解声明式事务控制

三:Spring事务角色

四:事务传播行为

 五:案例:转账业务追加日志


一:基本概念

             事务是开发中必不可少的东西, 使用JDBC开发时, 我们使用connnection对事务进行控制, 使用MyBatis时, 我们使用SqlSession对事务进行控制, 缺点显而易见, 当我们切换数据库访问技术时, 事务控制的方式总会变化,

         事务作用:在数据层保障一系列的数据库操作同时成功,同时失败

         Spring事务作用:在数据层或业务层保障一系列的数据库操作同时成功,同时失败

 如何使用呢?

 答:Spring提供了一个接口:

        Spring就将这些技术基础上, 提供了统一的控制事务的接口。Spring的事务分为:编程式事务控制和声明式事务控制

事务控制方式解释
编程式事务控制Spring提供了事务控制的类和方法, 使用编码的方式对业务代码进行事务控制, 事务控制代码和业务 操作代码耦合到了一起,开发中不使用
声明式事务控制Spring将事务控制的代码封装, 对外提供了Xml和注解配置方式, 通过配置的方式完成事务的控制, 可以达到事务控制与业务操作代码解耦合,开发中推荐使用

Spring事务编程相关的类主要有如下三个

事务控制相关类解释
平台事务管理器 Platform TransactionManager是一个接口标准,实现类都具备事务提交、回滚和获得事务对象的功能,不同持久层框架可能会有不同实现方案
事务定义 TransactionDefinition封装事务的隔离级别、传播行为、过期时间等属性信息
事务状态 TransactionStatus存储当前事务的状态信息,如果事务是否提交、是否回滚、是否有回滚点等

          虽然编程式事务控制我们不学习,但是编程式事务控制对应的这些类我们需要了解一下,因为我们在通过配置的方式进行声明式事务控制时也会看到这些类的影子

 

  • 搭建测试环境

搭建一个转账的环境, dao层一个转出钱的方法, 一个转入钱的方法, service层一个转账业务方法,内部分别调用dao层转出钱和转入钱的方法, 准备工作如下:

  • 数据库准备一个账户表tb account;

  • dao层准备一个AccountMapper, 包括incrMoney和decrMoney两个方法;

  • service层准备一个transferMoney方法, 分别调用incrMoney和decrMoney方法;

  • 在applicationContext文件中进行Bean的管理配置;

  • 测试正常转账与异常转账。

1.搭建基本环境

2.dao层准备一个AccountMapper, 包括incrMoney和decrMoney两个方法

package com.tangyuan.mapper;

public interface AccountMapper{
//+钱
    @Update("update tb_account set money=money+#{money} where account_name=#{accountName}")
public void incrMoney(@Param("accountName")  String accountName,@Param("money")  Integer money) ;
//-钱
     @Update("update tb_account set money=money-#{money} where account_name=#{accountName}")
public void decrMoney(@Param("accountName")  String accountName,@Param("money") Integer money) ;
}

3,在业务层接口上添加Spring事务管理  

public interface AccountService{
        @Transactional
      void transferMoney(String outAccount, String inAccount, Integermoney) ;

}
@Service("accountService")
public class AccountServiceImpl implements AccountService{
@Autowired
private AccountMapper accountMapper;
@Override
public void transferMoney(String outAccount, String inAccount, Integer money){
accountMapper.decrMoney(outAccount, money) ;
    //int i=1/0;
accountMapper.incrMoney(inAccount, money) ;
}
}

 

<!--组件扫描-->
<context:component-scan base-package="com.tangyuan"/>
<!--加载properties文件-->
<context:property-placeholder location="classpath:jdbc.properties"/>

<!--配置数据源信息-->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="driverClassName" value="S{jdbc.driver} "></property>
<property name="url" value="S{jdbc.url} "></property>
<property name="username" value="S{jdbc.username} "></property>
<property name="password" value="S{jdbc.password} "></property>
</bean>
<!--配置SqlSessionFactoryBean, 作用将sqlSessionFactory存储到spring容器-->
<bean class="org.mybatis.spring.SqlsessionFactoryBean">
     <property name="dataSource" ref="dataSource"></property>
</bean>

<!--MapperScannerConfigurer,作用扫描指定的包,产生Mapper对象存储到Spring容器-->
<bean class-"org.mybatis.spring.mapper.MapperScannerConfigurer">
    <property name="basePackage" value="com.tangyuan.mapper"></property>
</bean>

方式二:  

 

 

 

  • 基于xml声明式事务控制

    结合上面我们学习的AOP的技术, 很容易就可以想到, 可以使用AOP对Service的方法进行事务的增强。

    • 目标类:自定义的AccountServicelmpl,内部的方法是切点

    • 通知类:Spring提供的,通知方法已经定义好,只需要配置即可

    我们分析:

    • 通知类是Spring提供的,需要导入Spring事务的相关的坐标;

    • 配置目标类AccountServicelmpl;

    • 使用advisor标签配置切面。

<!--配置平台事务管理器-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource"ref="dataSource"/>
</bean>     

<!--配置Spring提供好的Advice-->
<!--命名空间需要设置-->
<tx:adviceid="txAdvice" transaction-manager="transactionManager">
  <tx:attributes>
      <tx:method name="*"/>
      <!--
          配置不同的方法的事务属性
          name :方法名称 * 代表通配符 添加操作addUser、addAccount、addOrders=>add*
          isolation:事务的隔离级别,解决事务并发问题
          timeout:超时时间 默认-1 单位:秒
          read-only:是否只读,查询操作设置为只读
          propagation:事务的传播行为,解决业务方法调用业务方法(事务嵌套问题)

     -->
  </tx:attributes>  
</tx:advice>

<!--事务增强的aop-->
<aop:config>
    <!--配置切点表达式-->
    <aop:pointcutid="txPointcut" expression="execution(*com.tangyuan.service.impl.*.*(..))"/>    
   <!--配置织入关系通知advice-ref引入Spring提供好的-->
    <aop:advisor advice-ref="txAdvice" pointcut-ref="txPointcut"/>
</aop:config>

 

二:事务相关配置  

 

 

  • 基于注解声明式事务控制

 

 

三:Spring事务角色

 

事务管理员:发起事务方,在Spring中通常指代业务层开启事务的方法

事务协调员:加入事务方,在Spring中通常指代数据层方法,也可以是业务层方法

四:事务传播行为

 

 五:案例:转账业务追加日志

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/167968.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Vue.nextTick核心原理

相信大家在写vue项目的时候&#xff0c;一定会发现一个神奇的api&#xff0c;Vue.nextTick。为什么说它神奇呢&#xff0c;那是因为在你做某些操作不生效时&#xff0c;将操作写在Vue.nextTick内&#xff0c;就神奇的生效了。那这是什么原因呢&#xff1f; 让我们一起来研究一…

手把手教你写Dockerfile以及测试

Dockerfile是什么&#xff1f; dockerfile就是用来构建docker镜像的构建文件,命令参数脚本。 如何使用Dockerfile&#xff1f; 1、编写一个Dockerfile文件2、docker build构建成 基础使用&#xff08;此处罗列一些我们经常用到的&#xff09; # 指定依赖镜像版本&#xff…

【附代码】十大主流聚类算法

准备工作安装必要的库pip install scikit-learn准备数据集使用 make _ classification ()函数创建一个测试二分类数据集。数据集将有1000个示例&#xff0c;每个类有两个输入要素和一个群集。这些群集在两个维度上是可见的&#xff0c;因此我们可以用散点图绘制数据&#xff0c…

第18章_JDBC

一、JDBC概述JDBC概述什么是JDBCJDBC&#xff08;Java DataBase Connectivity, Java数据库连接&#xff09; ,是一种用于执行SQL语句的Java API&#xff0c;为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成有了JDBC&#xff0c;程序员只需用JDBC API写一个…

夜深忽梦少年事,7年又一年,来看看95年那个小伙现在怎么样了

2022年已到尾声&#xff0c;疫情也结束了&#xff0c;这三年太不容易了&#xff0c;今年也是一样在疫情的艰难的度过&#xff0c;就是做了两件事&#xff0c;防疫和上班&#xff0c;没什么可写的。但是在一个深夜晚上&#xff0c;想了很多以前的事&#xff0c;想想还是写一点东…

亚马逊云科技Amazon DeepRacer互联网行业全国冠军诞生

1月11日&#xff0c;首届亚马逊云科技Amazon DeepRacer自动驾驶赛车互联网行业全国总决赛圆满结束&#xff0c;从全国各地选拔出的9支冠军队伍齐聚滨海三亚&#xff0c;向总决赛的桂冠发起了冲击。 本次比赛沿袭了Amazon DeepRacer League全球赛事标准&#xff0c;使用了全新的…

Vue.js的this如何取到data和method里的属性?

本篇文章介绍的是Vue.js如何取到data和methods里的属性&#xff1f; 准备工作 克隆源码到本地 git clone https://github.com/vuejs/vue.git 下载完毕后&#xff0c;用vscode打开&#xff0c;目光移动到package.json的scripts属性&#xff0c;我们看到有dev和build&#xff0…

Golang -- openwechat发送消息、自动回复

开篇 马上就要到农历新年了&#xff0c;不妨写一段代码准时为好友们送上祝福。 该 Demo 使用开源项目 openwechat &#xff0c;实现获取好友列表、为好友发送消息、图片或文件&#xff0c;接收来自好友或群组的消息并设置自动回复等功能。 openwechat Github地址 openwechat 文…

CSS设置元素内边距(padding)、外边距(margin)

设置元素内边距padding 所有的 HTML 元素基本都是以矩形为基础。 每个 HTML 元素周围的矩形空间由三个重要的属性来控制&#xff1a; padding&#xff08;内边距&#xff09; margin&#xff08;外边距&#xff09; border&#xff08;边框&#xff09; padding控制着元素内容…

产品经理需要懂的专业术语有哪些?

不同的行业都有着不同的专业术语&#xff0c;掌握专业术语不仅是个人专业能力的体现&#xff0c;还可以进一步促进工作中的交流&#xff0c;提高工作效率。 1、工作类 BRD&#xff1a;商业文档&#xff0c;包含了商业几乎&#xff0c;产品背景&#xff0c;可行性说明&#xff…

Redis底层数据结构简介

目录 1、Redis存储结构 2、数据结构 2.1、简单动态字符串(SDS) 2.2.1、SDS数据结构 2.2.2、编码 2.2.3、SDS与C字符串对比 2.2、链表(Linkedlist) 2.2.1、链表数据结构(双向链表) 2.2.2、特性 2.3、跳表(Skiplist) 2.3.1、数据结构 2.3.2、特点 2.3.3、增删查操作…

宝元机床联网

一、设备信息确认 宝元数控在台湾也是做的比较早的数控系统品牌&#xff0c;13年被研华并购。 1、确认型号 宝元的数控面板关机情况下是没办法判断型号的&#xff0c;要在开机的一瞬间确认。 此系统为&#xff1a;M520 注&#xff1a;目前接触宝元系统基本上都含网口。 2、…

maven依赖设置

之前说过了可以通过依赖的方式将一个大程序分为多个小的模块&#xff0c;模块之间可以利用依赖链接在一起。 但是如果有多个依赖的情况下会怎么样呢&#xff1f; A依赖于B、C&#xff0c;而B、C又有各自的依赖&#xff0c;那么A是否依赖于B、C的依赖呢&#xff1f; 答案是是的…

OpenResty中Lua变量的使用

全局变量 在 OpenResty 里面&#xff0c;只有在 init_by_lua* 和 init_worker_by_lua* 阶段才能定义真正的全局变量。 这是因为其他阶段里面&#xff0c;OpenResty 会设置一个隔离的全局变量表&#xff0c;以免在处理过程污染了其他请求。 即使在上述两个可以定义全局变量的阶…

全息(CSDN_0009_20220919)

文章编号&#xff1a;CSDN_0009_20220919 目录 全息的广义概念 发展历程 全息摄影 全息投影 全息影像 全息应用 全息投影 全息的广义概念 反映物体在空间存在时的整个情况的全部信息。 特指一种技术&#xff0c;可以让从物体发射的衍射光能够被重现&#xff0c;其位置和…

uniapp获取微信openid - 微信提现 - 登录授权 - AndroidStudio离线打包微信登陆

效果图 主要步骤 (详细步骤有配图) 登录微信开放平台,获取AppID + AppSecrethttps://open.weixin.qq.com/

mysql:浅显易懂——存储引擎

mysql&#xff1a;浅显易懂——存储引擎 最近学到了存储引擎(尚硅谷的康老师视屏)。 首先存储引擎并不是什么高大上的东西&#xff0c;可以直接理解为&#xff0c;表类型 所以存储引擎是针对表的描述。 那么如何学习&#xff1f;——就学mysqll中不同的表类型。和不同类型的…

【初阶数据结构】——二叉树OJ练习

文章目录前言1. 单值二叉树思路分析思路1. 遍历对比思路2. 递归代码实现2. 判断两棵二叉树是否相同思路分析代码实现3. 另一棵树的子树思路分析代码实现4. 返回二叉树结点的前序遍历数组思路分析代码实现5. 对称二叉树思路分析代码展示前言 上一篇文章我们刚刚学完二叉树初阶的…

使用nginx的rtmp模块搭建RTMP和HLS流媒体服务器

使用nginx的rtmp模块搭建RTMP和HLS流媒体服务器 文章目录使用nginx的rtmp模块搭建RTMP和HLS流媒体服务器环境搭建参数配置验证结果前面文章中已经介绍了《使用nginx搭建rtmp流媒体服务器》和《使用nginx搭建HLS服务器》&#xff0c;其实nginx的RTMP模块本身就支持接收RTMP推流、…

【jQuery】实现文件上传和loading效果

一、 jQuery实现文件上传1. 定义UI结构<!-- 导入 jQuery --><script src"./lib/jquery.js"></script><!-- 文件选择框 --><input type"file" id"file1" /><!-- 上传文件按钮 --><button id"btnUplo…