我的Spring学习记录(三)

IBM x3650M4服务器更换主板后,导入原有硬盘阵列信息 x3650m4服务器主板坏了,更换好的主板,需要导入原来硬盘的里面的阵列信息 1、开机有提示信息,按C导入配置 2、按Y继续 3、点击start进入阵列卡配置 4、选择configurations 1,点击preview 5、预览硬盘的阵列信息,点击import导入 6、导入成功,可以查看到阵列信息 7、重启服务器,进入操作系统 如果重启找不到操作系统,重启按f12,手动选择从onboard sas controller启动,进入系统一次后面重启就会自动找到并引导系统了。 8、有时候导入阵列 阅读详情

  学习了AOP之后就可以应用一下了,所以这次我们了解一下Spring的声明式事务。
  事务在我们的很多方面都可以体现,就拿我们平时的买卖活动,或者是银行的转账来说,这些活动要么是成功,要么是失败,比如:张三给李四转账100块钱,我们的实现是张三的账户划掉100然后李四的账户加上100,这是一个整体,要么成功,要么失败。我们不可能说张三的账户少了钱,但是因为某种原因导致李四的账户没多钱。所以说我们要通过某种机制保证这个整体活动的成功。接下来进入主题。
  

1. Spring事务简介

1.1 事务的四要素
名称内容
原子性(atomicity)整个事务中的所有操作,要么全部完成,要么全部不完成,不可能停滞在中间某个环节。
一致性(consistency)一个事务可以封装状态改变(除非它是一个只读的)。事务必须始终保持系统处于一致的状态,不管在任何给定的时间并发事务有多少。
隔离性(isolation)隔离状态执行事务,使它们好像是系统在给定时间内执行的唯一操作。
持久性(durability)在事务完成以后,该事务对数据库所作的更改便持久的保存在数据库之中,并不会被回滚。
1.2 Spring事务管理方式
  • 编程式事务
    编程式事务从名字应该可以看出,就是事务的管理方式由自己编写代码来实现,主要的实现方式就是通过对事务的代码嵌入进去我们的业务代码之中
  • 声明式事务
    声明事务主要是利用了Spring AOP通过面向切面编程把事务代码直接嵌入事务代码中,所以这里我们获取到的有事务管理的Bean实际上是Spring经过加工之后的代理类

概念性的东西不是内行,关于Spring事务的一些概念性的东西可以参考一下链接,希望有帮助
事务简介
|-https://baike.baidu.com/item/acid/10738?fr=aladdin
Spring事务
|-http://www.cnblogs.com/ysxlin/archive/2008/06/06/1215300.html
|- http://lxy2330.iteye.com/blog/1122183
|- http://www.cnblogs.com/longshiyVip/p/5061637.html

2. Spring事务准备工作

现在有两个人需要进行转账工作,我这里就随便的设计了这么一个剧情了,首先有一个dao(Data Access Object数据访问对象,与数据库打交道,这里我没有使用接口来实现,但是在一般的应用中是需要用接口实现的)

//这里继承了JdbcTemplate主要是方便实现,它对我们的Jdbc进行了封装,可以使我们不用考虑数据库连接关闭等等的问题
//而且此次的Spring事务主要是说的Jdbc事务
public class TransferDao extends JdbcTemplate {

    /**
     * 将钱的数目转向当前user的账户
     * @param money money
     * @param username username
     */
    public void transferMoneyToOne(Float money, String username){
        this.update("UPDATE account SET money = money + (?) WHERE username = ?", money, username);
    }
}

还有一个service(这里主要是写我们业务相关的代码)

public class TransferService {

    private TransferDao dao;

    /**
     * 转账业务,这里为了方便直接写了张三转给了李四100块钱
     */
    public void transferMoney(){
        dao.transferMoneyToOne((float) -100, "张三");
//        int i = 1 / 0;//为了测试出现异常的情况,测试时可去掉
        dao.transferMoneyToOne((float) 100, "李四");
//        throw new RuntimeException("这里突然死机了");//测试时可去掉
    }

    public TransferDao getDao() {
        return dao;
    }

    public void setDao(TransferDao dao) {
        this.dao = dao;
    }
}

上面注释抛出的异常和代码错误主要是为了等下代码测试的时候模拟我们日常中可能出现的各种错误
这里还需要一个数据库和表(数据库自建,表的sql在下方)

-- ----------------------------
-- Table structure for man
-- ----------------------------
DROP TABLE IF EXISTS `account`;
CREATE TABLE `account` (
  `username` varchar(255) default NULL,
  `money` float(255,0) default NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of man
-- ----------------------------
INSERT INTO `account` VALUES ('张三', '9600');
INSERT INTO `account` VALUES ('李四', '970');

3. Spring事务配置

事务需要加入的依赖较之前的需要加入tx依赖而且涉及数据库操作需要mysq连接包以及数据库连接池,这里使用的是阿里的druid,maven的pom.xml依赖主要如下:

 <properties>
        <spring.version>4.3.10.RELEASE</spring.version>
    </properties>

    <dependencies>
        <!-- https://mvnrepository.com/artifact/commons-logging/commons-logging -->
        <dependency>
            <groupId>commons-logging</groupId>
            <artifactId>commons-logging</artifactId>
            <version>1.2</version>
        </dependency>


        <!-- https://mvnrepository.com/artifact/com.alibaba/druid -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.0.31</version>
        </dependency>


        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>${spring.version}</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.44</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.springframework/spring-core -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>${spring.version}</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>${spring.version}</version>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-beans</artifactId>
            <version>${spring.version}</version>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context-support</artifactId>
            <version>${spring.version}</version>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-expression</artifactId>
            <version>${spring.version}</version>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aop</artifactId>
            <version>${spring.version}</version>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aspects</artifactId>
            <version>${spring.version}</version>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-tx</artifactId>
            <version>${spring.version}</version>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
            <version>${spring.version}</version>
        </dependency>

        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>RELEASE</version>
        </dependency>
    </dependencies>

以下是classpath下的applicationContext.xml配置文件
因为是事务配置与之前的相比需要加入tx命名约束

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       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/aop
        http://www.springframework.org/schema/aop/spring-aop-4.0.xsd
        http://www.springframework.org/schema/tx
        http://www.springframework.org/schema/tx/spring-tx-4.0.xsd">

    <!--配置DataSource-->
    <bean name="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
        <!--以下是数据库连接的具体信息-->
        <property name="username" value="root"/>
        <property name="password" value="root"/>
        <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://localhost:3306/spring_demo_1"/>
    </bean>

    <!--配置TransferDao-->
    <bean class="cn.lger.dao.TransferDao" name="transferDao">
        <property name="dataSource" ref="dataSource"/>
    </bean>

    <!--配置TransferService-->
    <bean name="transferService" class="cn.lger.service.TransferService">
        <property name="dao" ref="transferDao"/>
    </bean>

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

    <!--给定管理事务的类 设置通知-->
    <tx:advice id="txAdvice" transaction-manager="transactionManager">
        <tx:attributes>
            <!--
                这里设置需要事务操作的方法(切入点),
                其中还有一些属性没有写,这里全部采用默认操作,
                *为全部都需要事务操作
            -->
            <tx:method name="*"/>
        </tx:attributes>
    </tx:advice>

    <!--配置切面-->
    <aop:config>
        <!--设置切入点-->
        <aop:pointcut id="txPointcut" expression="execution(* cn.lger.service.TransferService.*(..))"/>
        <!--给定之前配置的通知-->
        <aop:advisor advice-ref="txAdvice" pointcut-ref="txPointcut"/>
    </aop:config>

</beans>

在上面的tx通知配置中<tx:method name="*"/>,注释写明了采用默认的操作,但是这里还是提一下,<tx:method name="被代理方法名(需要事务管理的方法)" propagation="传播行为" read-only="是否只读" isolation="隔离级别" timeout="事务所需最大时间"/> 这里不作赘述,下面的链接我个人觉得解释的很好

事务配置之<tx:method/> 有关的设置
http://blog.sina.com.cn/s/blog_4a40057401000865.html
http://www.iteye.com/topic/410461

4. Spring事务测试

经过以上的准备工作以及配置这个项目已经能够运行了,所以,我们现在来测试一下当没有发生异常的情况下是否能够转账成功

public class TestTx {

    /**
     * 测试service的转账功能
     */
    @Test
    public void test01(){
        ApplicationContext context =
                new ClassPathXmlApplicationContext("classpath:applicationContext.xml");
        TransferService service = context.getBean(TransferService.class);
        service.transferMoney();
    }
}

经过测试张三成功地转账给了李四100元,然后我们把之前的TransferService的异常的注释给去掉,然后进行测试,发现数据库中的数据稳如泰山,不会变,这就是事务,当抛出异常时会影响事务的ACID四要素,这个整体活动当然不会成功执行,所以,你看到的这就是事务。

上面代码可以在Github下载

SAP-ABAP:SAP客户端管理核心事务码SCC4深度解析 SAP客户端管理核心事务码SCC4深度解析 阅读详情

相关推荐

Verilog实战:手把手教你实现IEEE 754单精度浮点乘法器(附完整代码)

本文详细介绍了如何使用Verilog实现IEEE 754单精度浮点乘法器,包括标准解析、架构设计、Verilog代码实现及优化技巧。通过两级流水线设计,平衡性能与面积,适用于数字信号处理、AI加速器等高性能计算场景。

weixin_33724046的博客 315

Spring Boot 学习记录笔记【 三 】

Spring Boot 学习记录笔记【 三 】

java_zhangfei的博客 636

保姆级教程:用GROMACS 2022.4的拉伸模拟(SMD)加速蛋白-蛋白组装过程

本文详细介绍了如何使用GROMACS 2022.4的拉伸分子动力学模拟(SMD)技术加速大蛋白组装过程。通过CHARMM36力场和SMD技术,将传统需要数月的蛋白结合过程缩短至数天,大幅提升模拟效率。文章包含参数设计、索引组创建、周期性边界处理等实战技巧,并提供了完整的GPU加速工作流和常见问题解决方案。

weixin_30338481的博客 446

spring学习记录(三)

// Prepare this context for refreshing. prepareRefresh(); // Tell the subclass to refresh the internal bean factory. ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory(); // Prepare the bean factory for use in this context.

whhwch1986的博客 158

告别底噪和发热:TPA3255的PCB布局与散热设计保姆级教程(附嘉立创EDA文件)

本文详细解析TPA3255 Class D音频功放的PCB布局与散热设计,提供从电源系统分层架构到热管理系统的全流程优化方案。通过实战案例展示如何消除底噪、降低发热,并附嘉立创EDA文件,助力工程师快速设计高性能音频功放。

weixin_29208077的博客 379

Spring总结三:AOP 学习记录

AOP 先来谈谈为什么需要AOP?     从一个例子来引出一下,当然AOP的应用不光是为了解决这个问题,只是这个问题可以很好的反应直击AOP的本质。     我们来看这样一个需求:在程序执行期间追踪正在发生的活动,说白了就是记录日志信息?     比较容易想到的就是在方法中直接...

yue_xx的博客 339

webpack性能优化-optimization.splitChunks.chunks中的“all“、“async“和“initial“

最初,chunks(以及内部导入的模块)是通过内部 webpack 图谱中的父子关系关联的。CommonsChunkPlugin 曾被用来避免他们之间的重复依赖,但是不可能再做进一步的优化。 ——摘自 webpack 从 webpack v4 开始,移除了 CommonsChunkPlugin,取而代之的是 optimization.splitChunks。 而关于 optimization.splitChunks 中的chunks,webpack 官方文档却没有很好的进行举例解释,只说明了 async.

程序员秋风的博客 3137

Spring学习记录(三)

我们在spring使用中,有时候需要用到外部文件,如数据库配置,这是好,我们来学习下使用外部属性文件:首先,我们在src下新建一个db.properties文件,它的里面保存我们的数据库设置,然后我们应该在xml文件读取它,db,properties,如下:user=root password=root driverclass=com.mysql.jdbc.Driver jdbcurl=jdbc:...

qq_37561761的博客 281

Neo4j LLM知识图谱构建器使用教程

是一个开源应用程序,旨在将非结构化数据(如PDF、文档、文本、YouTube视频、网页等)转换为存储在Neo4j中的知识图谱。该项目利用大型语言模型(如OpenAI、Gemini等)从文本中提取节点、关系及其属性,并通过Langchain框架创建结构化的知识图谱。

u013250861的博客 541

基于STM32L4XX、HAL库的MMA8452QR1姿态传感器驱动程序设计

/ HAL库需要左移1位。#define MMA8452Q_I2C_ADDRESS 0x1D // SA0=1时的地址。* @param range: 量程(MMA8452Q_RANGE_2G/4G/8G)* @param haccel: MMA8452Q句柄。* @param haccel: MMA8452Q句柄。* @param haccel: MMA8452Q句柄。* @param haccel: MMA8452Q句柄。* @param haccel: MMA8452Q句柄。

zhusl6688的博客 772

Spring学习记录(三):Spring IOC源码学习(上)

Spring学习记录(三):Spring IOC源码学习 文章目录Spring学习记录(三):Spring IOC源码学习前言一、Spring源码学习1.基础流程2.ClassPathXmlApplicationContext2.1 结构图2.2 源码2.2.1 setConfigLocations2.2.2 refresh2.2.2.1 prepareRefresh2.2.2.2 obtainFreshBeanFactory 前言        上文讲述了Spr

weixin_44544536的博客 129

第20期-英伟达笔试题型解析

英伟达作为AI领域的缔造者及硬件基石,是这几年最为炙手可热的公司。英伟达以其高性能GPU设计闻名,硬件工程师岗位的招聘通常包括笔试和技术面试,考察领域涵盖数字电路设计、处理器架构、嵌入式系统和信号处理等。通过搜索公开平台,收集了候选人的面试经历和相关技术问题,,通过分析公开平台收集的笔试面试经验,结合英伟达的GPU架构特点,整理出可能涉及的典型题目,并提供详细解析。 以下是基于英伟达(Nvidia)硬件工程师笔试题型的解析与总结,涵盖核心知识点、解题思路及案例分析。

启芯硬件的博客 746

Spring入门学习记录(三):Spring与Web层的整合

舍弃了Servlet后的Spring和web层的第一次整合,后续还会不断的演化!但是我们要知道他们的前身都是些什么!

qq_59057509的博客 675

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Spring5学习记录(三)之AOP概念及使用教程

主要学习了基于注解的面相切面编程

LB_Wuyanzu的博客 1067

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

Spring学习记录(三)--一些用到的注解

@Component 组件,放在类上,会自动将这个类注册为bean,该类的相关属性,可以通过@Value()配置属性字段。常用于简单类 –该注解有许多衍生注解,在web开发中,会按照mvc三层架构分层.这些注解功能相同,仅是所处的位置不同 –dao [@Repository] –service [@Service] –controller [@Controller] –在使用...

Vayne_10的博客 214

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Spring In Action学习记录(三)高级装配

3.1 高级装配 3.1.1 配置profile bean 3.1.2 激活profile 3.2 条件化的bean 3.2.1 处理自动装配的歧义性 3.2.2 标识首选的bean 3.2.3 限定自动装配的bean 3.3 bean的作用域 3.3.1 使用会话和请求作用域 3.3.2在XML中声明作用域代理 3.4 运行时值注入 3.4.1 注入外部的值 3.4.2 使用Spring表达式语...

c630843901的博客 178

spring boot 学习(三)API注解记录及测试

Spring MVC中最为常用的几个核心注解@Controller,@RestController,RequestMapping 还有一些其他注解的简单使用,最后附上一份简单Controller类。

FunriLy 3211

Spring Cloud 学习记录(三)Hystrix

Spring Cloud 学习记录(二)Hystrix Hystrix 主要用来保护服务调用的一方。如果被调用的服务发生故障,符合一定条件,就开启断路器,对调用的程序进行隔离。 首先创建测试代码: spring-hystrix-server 作为服务端,使用sts进行快速创建,一下是代码: pom文件 &amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&amp;gt; &

jkjkjkll的博客 258

学习SSM的记录(三)-- Spring Framework--AOP

OOP可以定义纵向的关系,但不适合定义横向的关系(如:日志功能,日志往往需要横向的分布在所有的对象层次,但OOP无法在对象中实现局部修改,即在对象中的核心方法前后加上日志代码),而AOP能够很好的完善OOP。即之前出现过的"execution(* com.qiu.service.impl.*.*(..))",aop注解通过该表达式来寻找切点。System.out.println("方法开始");System.out.println("方法开始");System.out.println("方法开始");

abcd661054026的博客 1081

Spring学习记录(三)——Bean的自动装配

2018.4.13仅为个人理解 不足之处欢迎指正~什么是自动装配?自动装配即(Autowire) 是Spring中引入的一个机制它的作用是:解决&lt;bean&gt;标签下&lt;property&gt;标签过多的问题在上一篇文章中 我们举了一个汽车——车身——底盘——轮胎的例子在这个例子中每一层的类仅需要注入一个类所以我们可以看到 一个Bean中仅需要注入一个类:但是在实际项目中 一个Bean...

tzy1997 310

学习的spring boot 2.0的记录(三):集成JPA

前言: 学习的地址:https://www.majiaxueyuan.com/front/showcoulist 、https://www.bilibili.com/video/av47407342/ SpringBoot的pom依赖(以2.0版本为例的): 当前记录的是集成jpa: 目录 1.添加依赖 2.编写代码和配置文件 3.测试 1.添加依赖 ...

GinChou的萌新博客 213

Spring Cloud学习记录(三)Eureka常用配置

eureka: client: #eureka客户端配置 register-with-eureka: true #是否将自己注册到eureka服务端上去 fetch-registry: true #是否获取eureka服务端上注册的服务列表 service-url: defaultZone: http://localhost:8001/eureka/ # 指...

GaoXiR的博客 275

Maven学习记录(三)--实战引入Spring支持

一.创建项目maven项目在IDEA下创建是相当容易然后给定项目坐标,确定即可二.完善项目目录结构IDEA创建完项目结构和标准的maven项目有些差异,这个时候就需要我们手动调整一下更改前结构 更改后三.引入spring支持引入框架无非三步走: 1. 引入架包 2. 创建配置文件 3. 加载配置文件 接下来的步骤也是按照这三步走方法来的首先是pom.xml文件,增加spring和spri

Slow_Wakler的专栏 672

Spring之旅 - 记录学习 Spring 框架的过程和经验(三)Bean的依赖注入配置、Spring的其它配置标签

在这篇博客中,我们探讨了 Spring 框架中 Bean 的依赖注入配置,以及如何使用 XML 和注解两种方式来管理应用程序中的依赖关系。通过理解依赖注入的原理和实践,开发者可以有效地构建更为灵活和可维护的应用程序。此外,我们也介绍了一些常用的 Spring 配置标签,这些标签在日常开发中非常实用,可以帮助简化配置和提升开发效率。了解这些配置标签的使用,不仅能提高开发者的工作效率,还能帮助团队在项目中保持一致的编码规范。

m0_63267251的博客 855

Spring-boot-demo学习记录(三)-集成 spring-boot-starter-actuator 用于监控 spring-boot 的启动和运行状态

Spring-boot-demo学习记录 目录 Spring-boot-demo学习记录 前言 一、demo是什么? 二、使用步骤 1.新建子模块 2.代码编写 总结 前言 此系列博客是个人在学习springBoot的学习笔记,算是一个记录吧,一方面记录学习的内容,一方面记录学习中犯下的错误。学习springBoot选择的是GitHub上一个比较著名的项目,链接如下https://github.com/xkcoding/spring-boot-demo.git...

qq_31374621的博客 1434
上一篇: 我的Spring学习记录(二)
下一篇: 我的Spring学习记录(四)
lger_Pro
博客等级 码龄10年 44粉丝 48原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值