Spring 学习(八)事务管理

news2024/11/25 11:00:27

1. 事务

1.1 事务的 ACID 原则

  • 数据库事务(transaction)是访问并可能操作各种数据项的一个数据库操作序列。事务必须满足 ACID 原则——即原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)。

    • 原子性指事务是数据库工作的最小单位,一个事务中的所有操作要么全部成功提交,要么全部失败回滚。
    • 一致性指事务操作不能破坏数据的一致性,数据库在一个事务的执行前后都应处于一致性状态。
    • 隔离性指数据库并发情况下,并发的事务直接是隔离的,一个事务的执行不能被其他事务影响。
    • 持久性指一旦事务提交,则其对数据的变更就是永久性的,即使数据库发生任何故障都不应该对数据造成任何影响。
  • 以下业务中,虽然执行了添加和删除用户的两个操作,但因为删除操作的失败,导致数据库中的数据与我们原本期望的不一致,因此违反了 ACID 原则,Spring 中有对事务的相关配置来避免此种情况的发生。

    • 业务代码

      • User.java

        @Data
        @AllArgsConstructor
        @NoArgsConstructor
        public class User {
            private int id;
            private String name;
            private String pw;
        }
        
      • UserMapper.java

        public interface UserMapper {
            public List<User> selectUser();
        
            public int addUser(User user);
        
            public int deleteUser(int id);
        }
        
      • UserMapper.xml

        <?xml version="1.0" encoding="UTF-8" ?>
        <!DOCTYPE mapper
                PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
                "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
        <mapper namespace="com.why.mapper.UserMapper">
        
            <insert id="addUser" parameterType="com.why.pojo.User">
                insert into user (id, name, pw) values (#{id}, #{name}, #{pw});
            </insert>
        
            <!--这里将删除语句故意写错-->
            <delete id="deleteUser" parameterType="int">
                deletes from user where id = #{id};
            </delete>
        
        </mapper>
        
      • UserMapperImpl.java

        public class UserMapperImpl extends SqlSessionDaoSupport implements UserMapper {
        
            public List<User> selectUser() {
                UserMapper mapper = getSqlSession().getMapper(UserMapper.class);
        
                User user = new User(5, "李四", "555555");
                mapper.addUser(user);
                mapper.deleteUser(5);
                List<User> users = mapper.selectUser();
                return  users;
            }
        
            public int addUser(User user) {
                int i = getSqlSession().getMapper(UserMapper.class).addUser(user);
                return i;
            }
        
            public int deleteUser(int id) {
                int i = getSqlSession().getMapper(UserMapper.class).deleteUser(5);
                return i;
            }
        }
        
      • MyTest.xml

        @Test
            public void testProblem() {
                ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
                UserMapper userMapper = context.getBean("userMapper", UserMapper.class);
                List<User> users = userMapper.selectUser();
                for (User user : users) {
                    System.out.println(user);
                }
        
            }
        
    • 执行结果

      • 控制台报删除语句的错误

        在这里插入图片描述

      • 数据库执行了添加,没有删除,导致数据不一致问题

        在这里插入图片描述

13.1 Spring 事务管理

  • 声明式事务:AOP 的应用,不影响业务代码。

    • 在 Spring 的配置文件中创建一个 DataSourceTransactionManager 对象

      <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
          <!--<constructor-arg ref="dataSource" />-->
          <property name="dataSource" ref="dataSource"/>
      </bean>
      
    • 结合 AOP 实现事务的织入

      <!--配置事务的类-->
      <tx:advice id="txAdvice" transaction-manager="transactionManager">
          <!--给哪些方法配置事务-->
          <!--配置事务的传播特性-->
          <tx:attributes>
              <tx:method name="add" propagation="REQUIRED"/>
              <tx:method name="delete" propagation="REQUIRED"/>
              <tx:method name="update" propagation="REQUIRED"/>
              <tx:method name="query" read-only="true"/>
              <tx:method name="*" propagation="REQUIRED"/>
          </tx:attributes>
      </tx:advice>
      
      <!--配置事务切入-->
          <aop:config>
              <aop:pointcut id="txPointcut" expression="execution(* com.why.mapper.*.*(..))"/>
              <aop:advisor advice-ref="txAdvice" pointcut-ref="txPointcut"/>
          </aop:config>
      
    • 控制台报错

      在这里插入图片描述

    • 数据库数据保持了一致性

    在这里插入图片描述

  • 编程式事务:在代码中进行事务的管理。

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

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

相关文章

Keycloak怎么接入短信登录

Keycloak的介绍 Keycloak是一个开源软体产品&#xff0c;旨在为现代的应用程式和服务&#xff0c;提供包含身份管理和访问管理功能的单点登录工具。截至2018年3月&#xff0c;红帽公司负责管理这一JBoss社区项目&#xff0c;并将其作为他们RH-SSO产品的上游项目。[2]从概念的角…

python+turtle

turtle画图基本操作 基本代码 直接生成图形&#xff0c;不显示乌龟运动轨迹。turtle.tracer(False) import turtle turtle.pensize(1)turtle.tracer(False)#直接生成图形&#xff0c;不显示乌龟运动轨迹。 for i in range(1,100,10):turtle.circle(i)生成图形&#xff1a; 生…

怎样提取视频中的音频?十秒教会你

怎么提取视频中的音频&#xff1f;我们平时在刷视频的时候会听到一些很好听的背景音乐&#xff0c;但有时候我们会发现有的背景音乐音源下载不了&#xff0c;而有的音频是别人自己制作的&#xff0c;根本没有地方可以下载音频&#xff0c;那么我们想要获得视频里的音频要怎么办…

labview 混合信号图 多曲线分组

如果你遇到了混合信号图 多曲线分组显示的问题&#xff0c;本文能给你帮助。 在文章的最好&#xff0c;列出了参考程序下载链接。 一个混合信号图中可包含多个绘图区域。 但一个绘图区域仅能显示数字曲线或者模拟曲线之一&#xff0c;无法兼有二者。 以下显示的分两组&#…

Spring面试题22:Spring支持哪些ORM框架?优缺点分别是什么?Spring可以通过哪些方式访问Hibernate?

该文章专注于面试,面试只要回答关键点即可,不需要对框架有非常深入的回答,如果你想应付面试,是足够了,抓住关键点 面试官:Spring支持哪些ORM框架?优缺点分别是什么? Spring 支持多种 ORM(对象关系映射)框架,其中包括: Hibernate:Hibernate 是一个强大的 ORM 框架…

软考高级架构师下篇-17安全架构设计理论与实践

目录 1. 引言信息安全面临的威胁2. 安全体系架构的范围3.典型安全模型4.信息安全整体架构设计5.数据库系统安全设计6.系统架构脆弱性分析7.安全架构设计实践8. 前文回顾1. 引言 随着科技的发展,信息系统的安全受到诸多方面的威胁,设计信息系统安全架构需要从各个方面考虑,这…

LLM-TAP随笔——有监督微调【深度学习】【PyTorch】【LLM】

文章目录 5、 有监督微调5.1、提示学习&语境学习5.2、高效微调5.3、模型上下文窗口扩展5.4、指令数据构建5.5、开源指令数据集 5、 有监督微调 5.1、提示学习&语境学习 提示学习 完成预测的三个阶段&#xff1a;提示添加、答案搜索、答案映射 提示添加 “[X] 我感到…

NPDP产品经理认证怎么报名?考试难度大吗?

PMDA&#xff08;Product Development and Management Association&#xff09;是美国产品开发与管理协会&#xff0c;在中国由中国人才交流基金会培训中心举办NPDP&#xff08;New Product Development Professional&#xff09;考试&#xff0c;该考试是产品经理国际资格认证…

回归预测 | MATLAB实现RUN-XGBoost龙格库塔优化极限梯度提升树多输入回归预测

回归预测 | MATLAB实现RUN-XGBoost多输入回归预测 目录 回归预测 | MATLAB实现RUN-XGBoost多输入回归预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 MATLAB实现RUN-XGBoost多输入回归预测&#xff08;完整源码和数据&#xff09; 1.龙格库塔优化XGBoost&#xff0c;…

【Linux】详解线程第二篇——用黄牛抢陈奕迅演唱会门票的例子来讲解【 线程互斥与锁 】

线程互斥 与 锁 前言正式开始黄牛抢票demo问题解释if判断。tickets-\-数据不一致 临界资源与临界区互斥锁全局锁局部锁几个问题 互斥锁的原理单个线程时多线程申请锁总结申请锁流程 可重入和线程安全常见的线程不安全的情况常见的线程安全的情况常见不可重入的情况常见可重入的…

premiere 新建 视频导入 视频拼接 视频截取 多余视频删除

1 新建项目 文件 -> 新建 -> 项目 2 导入 2.1 方法一 直接从本地 将 文件拖入对应的文件夹 2.2 方法二 鼠标右键在指定素材文件夹, 选择导入 选择对应本地文件夹对应素材 3 预设 -> 粗剪 -> 在指定模块处 创建序列预设 3.1 指定模块处 鼠标右键 -> 新建项目…

Redis的集群方案

Redis的集群方案总共有3种&#xff1a; 1.主从同步 2.哨兵模式 3.分片集群 一.Redis的主从同步 单节点Redis的并发能力是有限的&#xff0c;要进一步提高Redis的并发能力&#xff0c;就需要搭建主从集群&#xff0c;实现读写分离&#xff0c;一般都是一主多从&#xff0c;…

体育运动模板推荐

最近的朋友圈一半是晒国庆城市布置的美景的&#xff0c;一半当然就是杭州亚运会了。目前杭州亚运会正在如火如荼的进行中&#xff0c;绝美的开幕式&#xff0c;运动健儿们奋力拼搏的精神&#xff0c;在杭州亚运会的舞台上&#xff0c;每个人都是独一无二的英雄。亚运会的舞台&a…

华为 Mate60 系列全球发布:地表最强黑科技旗舰,打破传统,引领未来!

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

‘nvcc‘不是内部或外部命令,也不是可运行的程序或批处理文件

一、首先检查是否正确安装 winR cmd打开终端,cd转到CUDA的位置,即C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v12.2\extras\demo_suite,然后输入bandwidthTest.exe并回车进行测试,最后输入deviceQuery.exe并回车进行测试,若Result PASS,则表示是安装成功了的 二、…

Redis集群方式

Redis有三种集群方式&#xff1a;主从复制&#xff0c;哨兵模式和集群。 1.主从复制 主从复制原理 从服务器连接主服务器&#xff0c;发送SYNC命令&#xff1b; 主服务器接收到SYNC命名后&#xff0c;开始执行BGSAVE命令生成RDB文件并使用缓冲区记录此后执行的所有写命令&…

【yolov1】yoloLoss.py

1.计算预测中心点与真实中心点的损失。 2.计算预测的宽高与真实宽高的损失。用根号&#xff0c;是使得小框对误差更敏感。第三项负责计算置信度的误差 标签值是预测框真实框的IOU&#xff0c;作为标签值。 第四项是不负责检测目标的框&#xff0c;让它们的Loss值越小越好。让…

Java函数式接口(Consumer、Function、Predicate、Supplier)详解及代码示例

函数式接口 java.util.function : Consumer :消费型函数接口 void accept(T t) Function :函数型接口 R apply(T t) Predicate :判断型接口 boolean test(T t) Supplier :供给型接口 T get() Consumer - 消费型函数接口 该接口代表了一个接受一个参数并且不返回结果的操作。…

vivado乘法器IP核进行无符号与有符号数相乘问题的验证

本文验证乘法器IP核Multiplier进行无符号(unsigned)与有符号数(signed)相乘的正确性&#xff0c;其中也遇到了一些问题&#xff0c;做此记录。 配套工程&#xff1a;https://download.csdn.net/download/weixin_48412658/88354179 文章目录 问题的讨论验证过程IP核配置例化乘…