Spring对事务的支持

一、事务

事务防止进行操作时,数据库里面的数据丢失。

二、Spring事务注解方式

注解方式:在配置文件中配置事务管理器,利用注解,管理事务。

实例

银行转账:一个账户向另一个账户转账。

1)先在数据库mysql中建立,账户和余额表,并对其赋值:

2)在程序中创建一个完整的javabean程序(Account类),其属性和mysql表中属性一致:

package com.bank.pajo;

public class Account {
    private String actno;
    private Double balance;

    @Override
    public String toString() {
        return "Account{" +
                "actno='" + actno + '\'' +
                ", balance=" + balance +
                '}';
    }
    public Account() {
    }

    public Account(String actno, Double balance) {
        this.actno = actno;
        this.balance = balance;
    }

    public String getActno() {
        return actno;
    }

    public void setActno(String actno) {
        this.actno = actno;
    }

    public Double getBalance() {
        return balance;
    }

    public void setBalance(Double balance) {
        this.balance = balance;
    }
}

2)引入依赖(pom.xml):

 <packaging>jar</packaging>
<!--仓库-->
    <repositories>
        <repository>
            <id>spring-milestones</id>
            <name>Spring Milestones</name>
            <url>https://repo.spring.io/milestone</url>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </repository>
    </repositories>
<!--依赖-->
    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>6.0.0-M2</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>6.0.0-M2</version>
        </dependency>
        <!-- mysql jar包 -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.30</version>
        </dependency>
<!--这是一个数据库连接池,在此可以配置数据源信息-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.2.13</version>
        </dependency>
        <dependency>
            <groupId>jakarta.annotation</groupId>
            <artifactId>jakarta.annotation-api</artifactId>
            <version>2.1.1</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.13.2</version>
            <scope>test</scope>
        </dependency>
    </dependencies>

3)创建一个接口(Acount),用于存放对数据库进行操作的语句方法,查看和更新:

package com.bank.dao;
import com.bank.pajo.Account;
//只执行sql语句
public interface Acount {
    //查询账户
    Account selectBy(String actno);
    //更新
    int update(Account acc);
}

 4)这个接口的实现类(AcountImp),将查看和修改的功能实现利用sql语句和JdbcTemplate:

package com.bank.dao;
import com.bank.pajo.Account;
import jakarta.annotation.Resource;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;

@Repository
public class AcountImp implements Acount{
    @Resource
    private JdbcTemplate j;

    @Override
    public Account selectBy(String actno) {//查看账户
        String sql="select actno,balance from t_act where actno=?";
        Account a=j.queryForObject(sql,new BeanPropertyRowMapper<>(Account.class),actno);
        return a;
    }

    @Override
    public int update(Account acc) {//更新余额
        String sql="update t_act set balance =? where actno=?";
         int count= j.update(sql,acc.getBalance(),acc.getActno());
        return count;
    }
}

5)定义一个转账接口(AcountSer):

package com.bank.service;
public interface AcountSer {
    void transfer(String fromActno,String toAcrno,double money);
}

 6)这个接口的实现类,进行转账功能:

package com.bank.service;
import com.bank.dao.AcountImp;
import jakarta.annotation.Resource;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.bank.pajo.Account;
@Service
public class AccountService implements AcountSer{
    @Resource
    private AcountImp acountImp;
    //从这个账户转到另个账户
    @Transactional//事务管理器
    @Override
    public void transfer(String fromActno, String toAcrno, double money) {
        Account from= acountImp.selectBy(fromActno);//这个账户信息
        if(from.getBalance()<money){
            throw new RuntimeException("余额不足");
        }
        Account to=acountImp.selectBy(toAcrno);//另一个账户信息
        from.setBalance(from.getBalance()-money);//一个钱数加
        to.setBalance(to.getBalance()+money);//一个钱数减
        //数据库更新
       int count= acountImp.update(from);
       //模拟异常
        String s=null;
        s.toString();
       count+=acountImp.update(to);
       if(count<2){
           throw new RuntimeException("转账失败,请联系银行");
       }

    }
}

spring.xml:

<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: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/tx http://www.springframework.org/schema/tx/spring-tx.xsd">
<!--组件扫描-->
    <context:component-scan base-package="com.bank"></context:component-scan>
<!--    配置数据源-->
    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
        <property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://localhost:3306/spring6"/>
        <property name="username" value="root"/>
        <property name="password" value="123456"></property>
    </bean>
<!--    配置JdbcTemplate-->
    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
        <property name="dataSource" ref="dataSource"></property>
    </bean>
<!--    配置事务管理器-->
    <bean id="txMange" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"></property>
    </bean>
<!--    事务注解驱动器开启,开启事务-->
    <tx:annotation-driven transaction-manager="txMange"></tx:annotation-driven>
</beans>

 测试类:

public class Test {
    @org.junit.Test
    public void test(){
        ApplicationContext applicationContext=new ClassPathXmlApplicationContext("spring.xml");
       AcountSer a= applicationContext.getBean("accountService", AcountSer.class);
       try{
           a.transfer("act-001","act-002",10000);
       }catch (Exception e){
           System.out.println("转账失败");
           e.printStackTrace();
       }

    }
}

 

成功案例(无模拟异常):

失败案例(有模拟异常) :刷新数据库的两个余额都未改变。

三、事务传播行为

重点为:REQUIRED和REQUIRES_NEW。

REQUIRES_NEW:事务A和事务B隔离开,若事务B发生异常,应对事务A进行捕捉异常,事务A就不会回滚,若不捕捉,则事务A发生回滚,数据无法保存。

 四、事务隔离级别

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

串联谐振回路

等效电路 电感的损耗电阻&#xff0c;频率越高越大&#xff0c;与电感串联&#xff0c;会分走电压&#xff0c;不可忽略。 电容的漏电电阻&#xff0c;等效阻值大&#xff0c;与电容并联&#xff0c;高频时&#xff0c;电容容抗小&#xff0c;漏电电阻几乎分不走电流&#xf…

找不到libcef.dll是怎么回事?libcef.dll丢失的6种修复方法

在使用电脑的过程中&#xff0c;我们可能会遇到一些错误提示&#xff0c;其中之一就是“电脑提示libcef.dll丢失”。这个问题可能让人感到困惑和烦恼&#xff0c;但通过了解其原因和解决方法&#xff0c;我们可以更好地应对类似的问题。在本文中&#xff0c;我将分享我对于“电…

QML Canvas 代码演示

一、文字阴影 / 发光 Canvas{id: root; width: 400; height: 400onPaint: //所有的绘制都在onPaint中{var ctx getContext("2d") //获取上下文// 绘制带阴影的文本ctx.fillStyle "#333" //设置填充颜色ctx.fillRect(0, 0, root.width, root.height…

Fluid 1.0 版发布,打通云原生高效数据使用的“最后一公里”

作者&#xff1a;顾荣 前言 得益于云原生技术在资源成本集约、部署运维便捷、算力弹性灵活方面的优势&#xff0c;越来越多企业和开发者将数据密集型应用&#xff0c;特别是 AI 和大数据领域应用&#xff0c;运行于云原生环境中。然而&#xff0c;云原生计算与存储分离架构虽…

【数字化转型,销售先行】销售的数字化转型需要做哪些工作?

引言&#xff1a;销售进行数字化转型的背景主要包括市场环境的快速变化、新技术发展的推动、企业发展的需求以及数据驱动决策的需求。这些背景因素共同促使企业加快数字化转型步伐&#xff0c;以适应市场变化、提升竞争力并实现可持续发展。 销售的数字化转型包含哪些内容&…

Qt飞机大战小游戏

Gitee地址 &#xff1a;plane-game: 基于Qt的飞机大战小游戏 GitHub地址&#xff1a; https://github.com/a-mo-xi-wei/plane-game

群晖NAS安装配置Joplin Server用来存储同步Joplin笔记内容

一、Joplin Server简介 1.1、Joplin Server介绍 Joplin支持多种方式进行同步用户的笔记数据&#xff08;如&#xff1a;Joplin自己提供的收费的云服务Joplin Cloud&#xff0c;还有第三方的云盘如Dropbox、OneDrive&#xff0c;还有自建的云盘Nextcloud、或者通过WebDAV协议来…

-bash: unzip: command not found

1、报错截图如下 2、解决办法 yum install unzip

【Python/Pytorch - 网络模型】-- 手把手搭建3D VGG感知损失模型

文章目录 文章目录 00 写在前面01 基于Pytorch版本的3D VGG代码02 论文下载 00 写在前面 感知损失&#xff1a;对于提升图片的肉眼可见细节&#xff0c;效果十分明显&#xff1b;对于一些指标如&#xff08;SSIM、PSNR&#xff09;这些&#xff0c;效果不明显。 在01中&…

微服务之远程调用

常见的远程调用方式 RPC&#xff1a;Remote Produce Call远程过程调用&#xff0c;类似的还有 。自定义数据格式&#xff0c;基于原生TCP通信&#xff0c;速度快&#xff0c;效率高。早期的webservice&#xff0c;现在热门的dubbo &#xff08;12不再维护、17年维护权交给apac…

A+B依旧可以卷!多尺度特征融合+注意力机制,新SOTA准确率高达99%

在处理复杂实际问题时&#xff0c;我们可以结合多尺度特征融合和注意力机制&#xff0c;让模型不仅能从多个尺度上捕获丰富的特征信息&#xff0c;还可以专注于输入中的关键部分&#xff0c;来提高模型的泛化能力和性能。 具体到图像处理领域&#xff0c;这种方法就是允许模型…

风控中的文本相似方法之余弦定理

一、 余弦相似概述 余弦相似性通过测量两个向量的夹角的余弦值来度量它们之间的相似性。0度角的余弦值是1&#xff0c;而其他任何角度的余弦值都不大于1&#xff1b;并且其最小值是-1。 从而两个向量之间的角度的余弦值确定两个向量是否大致指向相同的方向。结果是与向量的长…

重新安装TortoiseGit后提示权限错误问题解决

今天在Windows11系统中下载安装使用TortoiseGit可视化Git工具&#xff0c;进行代码提交管理。 由于电脑之前是一位开发人员在使用&#xff0c;所以曾经安装使用过这个工具。 重新安装好软件后&#xff0c;在coding网站中复制代码路径后&#xff0c;在本地目录通过鼠标右键选择…

WPF/C#:异常处理

什么是异常&#xff1f; 在C#中&#xff0c;异常是在程序执行过程中发生的特殊情况&#xff0c;例如尝试除以零、访问不存在的文件、网络连接中断等。这些情况会中断程序的正常流程。 当C#程序中发生这种特殊情况时&#xff0c;会创建一个异常对象并将其抛出。这个异常对象包…

Go微服务框架Kratos中makefile命令的使用方法及报错处理

运用 kratos 微服务框架开发项目时&#xff0c;可以使用提供的 makefile 中的命令自动且快速生产相关代码&#xff0c;提高开发效率。 krotos中makefile文件内容如下&#xff1a; GOHOSTOS:$(shell go env GOHOSTOS) GOPATH:$(shell go env GOPATH) VERSION$(shell git descri…

翻译英文文献工具

翻译英文文献工具 1. zotero1. 安装zotero2. 安装pdf翻译器2.1. 查看zotero版本2.2. 下载对应的pdf翻译器插件版本2.3. 安装插件2.4. 使用插件 2. 小绿鲸英文文献阅读器1. 安装2. 使用 1. zotero 1. 安装zotero 官网&#xff1a; https://www.zotero.org/ 一键next默认安装就…

(四)React组件、useState、组件样式

1. 组件 1.1 组件是什么 概念&#xff1a;一个组件就是用户界面的一部分&#xff0c;它可以有自己的逻辑和外观&#xff0c;组件之间可以相互嵌套&#xff0c;也可以复用多次。 组件化开发可以让开发者像搭积木一样构建一个完整的庞大应用 1.2 React组件 在React中&#xf…

独具韵味的移动端 UI 风格

独具韵味的移动端 UI 风格

《转载》前苏联的三进制计算机Setun

1、苏联的三进制计算机概述 早在 1956 年&#xff0c;就需要创建一种可在大学和实验室中使用的实用数字计算机模型。为此&#xff0c;需要一种易于学习、可靠、廉价但同时高效、专为大规模使用而设计的小型计算机。 对这种机器的要求&#xff1a;运行速度必须等于每秒数百次操作…

求单源最短路径的新方法

参见&#xff1a;dijkstra 算法为什么高效。 本来不想谈算法&#xff0c;本来只想了一下 dijkstra 算法背后的形而上&#xff0c;但还是归纳出一个仅靠一次广度优先遍历就能获得单源最短路径的新算法&#xff0c;框图里是算法流程&#xff0c;流程下是一个例子&#xff1a; …