【spring】事务

news2024/10/6 6:01:52

概述

1、什么事务
事务是数据库操作最基本单元,逻辑上一组操作,要么都成功,如果有一个失败所有操 作都失败

2、事务四个特性(ACID)
(1)原子性
(2)一致性
(3)隔离性
(4)持久性

搭建项目

1、创建数据库表,添加记录
2、创建 service,搭建 dao,完成对象创建和注入关系
(1)service 注入 dao,在 dao 注入 JdbcTemplate,在 JdbcTemplate 注入 DataSource
3、在 dao 创建两个方法:多钱和少钱的方法,在 service 创建方法(转账的方法)


@Service  
public class UserService {  
   //注入 dao   
   @Autowired  
   private UserDao userDao;  
   //转账的方法  
   public void accountMoney() {  
      //lucy 少 100      
      userDao.reduceMoney();  
      //mary 多 100      
      userDao.addMoney();  
   }  
}
@Repository  
public class UserDaoImpl implements UserDao {  
   @Autowired  
   private JdbcTemplate jdbcTemplate;  

   //lucy 转账 100 给 mary   //少钱  
   @Override  
   public void reduceMoney() {  
      String sql = "update t_account set money=money-? where username=?";  
      jdbcTemplate.update(sql,100,"lucy");  
   }  
   //多钱  
   @Override  
   public void addMoney() {  
      String sql = "update t_account set money=money+? where username=?";  
      jdbcTemplate.update(sql,100,"mary");  
   }  
}  

开启事务

概述

image.png

1、事务添加到 JavaEE 三层结构里面 Service 层(业务逻辑层)
2、在 Spring 进行事务管理操作
(1)有两种方式:

  • 编程式事务管理
    在代码中开启事务,提交等,太麻烦,基本不用
  • 声明式事务管理(常用)
    (1)基于注解方式(使用)
    (2)基于 xml 配置文件方式

4、在 Spring 进行声明式事务管理,底层使用 AOP 原理
5、Spring 事务管理 API
(1)提供一个接口,代表事务管理器,这个接口针对不同的框架提供不同的实现类
image.png

注解

配置

1、在 spring 配置文件配置事务管理器  
        <!--创建事务管理器-->  
<bean id="transactionManager"  
      class="org.springframework.jdbc.datasource.DataSourceTransactionManager">  
    <!--注入数据源-->  
    <property name="dataSource" ref="dataSource"></property>  
</bean>  
        2、在 spring 配置文件,开启事务注解  
        (1)在 spring 配置文件引入名称空间 tx  
<beans xmlns="http://www.springframework.org/schema/beans"  
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
       xmlns:context="http://www.springframework.org/schema/context"  
       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 http://www.springframework.org/schema/context/spring-context.xsd   
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd   
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">  
(2)开启事务注解  
<!--开启事务注解-->  
<tx:annotation-driven transaction-manager="transactionManager"></tx:annotation-driven>

或者
完全注解配置

@Configuration //配置类  
@ComponentScan(basePackages = "com.atguigu") //组件扫描  
@EnableTransactionManagement //开启事务  
public class TxConfig {  
   //创建数据库连接池  
   @Bean  
   public DruidDataSource getDruidDataSource() {  
      DruidDataSource dataSource = new DruidDataSource();  
      dataSource.setDriverClassName("com.mysql.jdbc.Driver");  
      dataSource.setUrl("jdbc:mysql:///user_db");  
      dataSource.setUsername("root");  
      dataSource.setPassword("root");  
      return dataSource;  
   }  
   //创建 JdbcTemplate 对象  
   @Bean  
   public JdbcTemplate getJdbcTemplate(DataSource dataSource) {  
      //到 ioc 容器中根据类型找到 dataSource      JdbcTemplate jdbcTemplate = new JdbcTemplate();  
      //注入 dataSource      jdbcTemplate.setDataSource(dataSource);  
      return jdbcTemplate;  
   }  
   //创建事务管理器  
   @Bean  
   public DataSourceTransactionManager  
   getDataSourceTransactionManager(DataSource dataSource) {  
      DataSourceTransactionManager transactionManager = new  
            DataSourceTransactionManager();  
      transactionManager.setDataSource(dataSource);  
      return transactionManager;  
   }  
}

3、在 service 类上面(或者 service 类里面方法上面)添加事务注解
(1)@Transactional,这个注解添加到类上面,也可以添加方法上面
(2)如果把这个注解添加类上面,这个类里面所有的方法都添加事务
(3)如果把这个注解添加方法上面,为这个方法添加事务

@Service
@Transactional 
public class UserService{

}

参数

1、在 service 类上面添加注解@Transactional,在这个注解里面可以配置事务相关参数
image.png

2、propagation:事务传播行为
(1)多事务方法直接进行调用,这个过程中事务 是如何进行管理的
image.png

3、ioslation:事务隔离级别
(1)事务有特性成为隔离性,多事务操作之间不会产生影响。不考虑隔离性产生很多问题
(2)有三个读问题:

  • 脏读
    一个未提交事务读取到另一个未提交事务的数据
  • 不可重复读
    一个未提交事务读取到另一提交事务修改数据
  • 虚(幻)读
    一个未提交事务读取到另一提交事务添加数据

(3)解决:通过设置事务隔离级别,解决读问题

image.png

image.png

4、timeout:超时时间
(1)事务需要在一定时间内进行提交,如果不提交进行回滚
(2)默认值是 -1 ,设置时间以秒单位进行计算

5、readOnly:是否只读
(1)读:查询操作,写:添加修改删除操作
(2)readOnly 默认值 false,表示可以查询,可以添加修改删除操作
(3)设置 readOnly 值是 true,设置成 true 之后,只能查询

6、rollbackFor:回滚
(1)设置出现哪些异常进行事务回滚

7、noRollbackFor:不回滚
(1)设置出现哪些异常不进行事务回滚

xml配置

第一步 配置事务管理器
第二步 配置通知
第三步 配置切入点和切面

<!--1 创建事务管理器-->  
<bean id="transactionManager"  
      class="org.springframework.jdbc.datasource.DataSourceTransactionManager">  
    <!--注入数据源-->  
    <property name="dataSource" ref="dataSource"></property>  
</bean>  
        <!--2 配置通知-->  
<tx:advice id="txadvice">  
<!--配置事务参数-->  
<tx:attributes>  
    <!--指定哪种规则的方法上面添加事务-->  
    <tx:method name="accountMoney" propagation="REQUIRED"/>  
    <!--<tx:method name="account*"/>-->  
</tx:attributes>  
</tx:advice>  
        <!--3 配置切入点和切面-->  
<aop:config>  
<!--配置切入点-->  
<aop:pointcut id="pt" expression="execution(* com.atguigu.spring5.service.UserService.*(..))"/>  
<!--配置切面-->  
<aop:advisor advice-ref="txadvice" pointcut-ref="pt"/>  
</aop:config>

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

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

相关文章

java语言跨平台的特性:“一次编译,到处运行”

“一次编译&#xff0c;到处运行”是java语言跨平台的特性&#xff0c;平台指的是操作系统平台。 程序从源代码到运行的三个必经阶段&#xff1a;编码——编译——运行&#xff0c;调试。 首先编码阶段&#xff0c;需要编码语言是一个程序设计语言&#xff0c;而我们的java是程…

ChatGPT解答:python大批量读写ini文件时,性能很低,有什么解决方法吗,给出具体的思路和实例

ChatGPT解答&#xff1a; python大批量读写ini文件时&#xff0c;性能很低&#xff0c;有什么解决方法吗&#xff0c;给出具体的思路和实例 ChatGPTDemo Based on OpenAI API (gpt-3.5-turbo). python大批量读写ini文件时&#xff0c;性能很低&#xff0c;有什么解决方法吗&…

springboot工程搭建的几种方式

一、通过idea工具搭建&#xff0c;如下&#xff1a; 新建Project和Module&#xff0c;选择Spring initializr&#xff0c;点击Next&#xff0c;进入到如下页面填写 填写完后点击Next 到如下页面&#xff0c;根据你的具体所需&#xff0c;选择要使用的技术依赖 点击Next 点击FIn…

巾帼绽芬芳 一起向未来(中篇)

编者按&#xff1a;为了隆重纪念纪念“三八”国际妇女节113周年&#xff0c;快来与你全方位、多层次分享交流“三八”国际妇女节的前世今生。分上篇&#xff08;节日简介、节日发展和节日意义&#xff09;、中篇&#xff08;节日活动宗旨和世界各国庆祝方式&#xff09;和下篇&…

云原生之docker网络详解

云原生之docker网络详解一、相关概念1.2、CNM1.3、libnetwork二、实操2.1、docker network常用命令2.2、运行一个docker容器&#xff0c;查看CNM三个概念2.3、查看docker0在内核路由表上的记录2.4、查看网络列表2.5、网络隔离效果展示2.6、host驱动网络一、相关概念 1.1、网桥…

链表经典刷题--快慢指针与双指针

本篇总结链表解题思路----快慢指针&#xff0c;其实也就是双指针&#xff0c;这个快慢并不单纯指“快慢”&#xff0c;它更多的可以表示&#xff0c;速度快慢&#xff0c;距离长度&#xff0c;时间大小等等&#xff0c;用法很有趣也很独特&#xff0c;理解它的思想&#xff0c;…

「并发编程实战」常见的限流方案

「并发编程实战」常见的限流方案 文章目录「并发编程实战」常见的限流方案一、概述二、计数器限流方案三、时间窗口限流方案四、令牌桶限流方案五、漏桶限流方案六、高并发限流算法小结文章参考&#xff1a; 追忆四年前&#xff1a;一段关于我被外企CTO用登录注册吊打的不堪往事…

01 | n2n虚拟局域网

1 n2n简介 为了满足两个不同局域网的机器进行通信&#xff0c;让不同网段的机器能够进行P2P( 点对点 peer-to-peer ) 通信。2 n2n源码 https://github.com/ntop/n2n.git3 n2n名词 3.1 SuperNode 超级节点 SuperNode 相当与注册中心, 它会记录边缘节点的连接信息&#xff0c;…

案例09-数据类型不一致导致equals判断为false

一&#xff1a;背景介绍 在判断课程id和班级id的时候如果一致就像课程信息进行更新&#xff0c;如果不一致就插入一条新的数据。其实两个变量的值是一致的但是类型是不一致的。这就导致数据库中已经有一条这样的数据了&#xff0c;在判断的时候结果为false&#xff0c;就有插入…

【这一篇就够】mysql创建JSON数据的索引

一. 创建索引 由于json有两类不同的数据形式&#xff0c;即&#xff1a;json对象&#xff08;如&#xff1a;{"id": 1, "name":"he"}&#xff09;&#xff0c;json数组&#xff08;如&#xff1a;["1","2","3"]&…

nexus安装与入门

安装 nexus-3.31.1-01-unix.tar.gz 链接&#xff1a;https://pan.baidu.com/s/1YrJMwpGxmu8N2d7XMl6fSg 提取码&#xff1a;kfeh 上传到服务器&#xff0c;解压 tar -zvxf nexus-3.31.1-01-unix.tar.gz进入bin目录&#xff0c;启动 ./nexus start查看状态 ./nexus status默…

初始Linux操作系统

个人简介&#xff1a;云计算网络运维专业人员&#xff0c;了解运维知识&#xff0c;掌握TCP/IP协议&#xff0c;每天分享网络运维知识与技能。座右铭&#xff1a;海不辞水&#xff0c;故能成其大&#xff1b;山不辞石&#xff0c;故能成其高。个人主页&#xff1a;小李会科技的…

Linux常用命令等

目录 1.Linux常用命令 (1)系统命令 (2)文件操作命令 2.vim编辑器 3.linux系统中,软件安装 (1) rpm 安装,RedHat Package Manager (2)yum 安装 (3)源代码编译安装 1.Linux常用命令 Linux命令是非常多的,对于像嵌入式开发工程师,运维工程师需要掌握的命令是非常多的.对于…

旋转矩形框标注--roLabelImg的使用

1. 旋转目标标注roLabelImg roLabelImg是一款开源的,可标注带旋转角度的矩形区域的标注软件。roLabelImg源码github地址: https://github.com/cgvict/roLabelImg labelme和labelimg只能标矩形框,但不能标注旋转角度。roLabelImg既能标矩形框也能标注矩形框的选择角度,因此…

复旦发布中国版 ChatGPT :MOSS

不知道这个人工智能&#xff0c;有没有获得完整的一生。ChatGPT 是最先进的 AI&#xff0c;也是最热门的应用 —— 自去年 11 月底发布以来&#xff0c;它的月活跃用户两个月超过一亿&#xff0c;轻松拿到了全球互联网史上用户增长速度的第一。它也是一种门槛很高的技术。由于 …

服务预热配置化在泛型化方法上的实践

背景 由于开发过程中&#xff0c;个别dubbo接口的调用会在服务发布过程中&#xff0c;出现P99耗时报警问题。因此我们计划通过预热服务接口&#xff0c;通过预热来触发JIT&#xff0c;构建DB资源长链接。实现服务接口上线后&#xff0c;耗时过长&#xff0c;资源等待等问题&am…

基于RWEQ模型的土壤风蚀模数估算及其变化归因分析

查看原文>>>基于RWEQ模型的土壤风蚀模数估算及其变化归因分析 土壤风蚀是一个全球性的环境问题。中国是世界上受土壤风蚀危害最严重的国家之一&#xff0c;土壤风蚀是中国干旱、半干旱及部分湿润地区土地荒漠化的首要过程。中国风蚀荒漠化面积达160.74104km2&#xff…

python re模块匹配字符串

python 正则模块re 要使用python3中的RE则必须引入 re模块 import re re模块的match函数 result re.match(^[A-Z]{1}[a-z], s) match 尝试从字符串的起始位置匹配一个模式&#xff0c;如果不是起始位置匹配成功的话&#xff0c;match()就返回none。 匹配到了&#xff0c;则…

AI for Science系列(二):国内首个基于AI框架的CFD工具组件!赛桨v1.0 Beta API介绍以及典型案例分享!

AI for Science被广泛认为是下一代科研范式&#xff0c;可以有效处理多维度、多模态、多场景下的模拟和真实数据&#xff0c;解决复杂推演计算问题&#xff0c;加速新科学问题发现[1] 。百度飞桨科学计算工具组件赛桨PaddleScience是国内首个公开且可应用于CFD&#xff08;Comp…

通过工厂模式实现SpringBoot+MQTT-订阅与消费

引言 Spring Boot 是一款用于构建基于 Spring 框架的快速应用程序的开源框架。它的目标是简化 Spring 应用程序的开发和部署过程&#xff0c;Spring Boot 通过提供一些默认配置和自动配置&#xff0c;可以让开发者更快的创建一个独立的、产品级别的 Spring 应用程序。 MQTT 是…