IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> Spring声明式事务介绍 -> 正文阅读

[Java知识库]Spring声明式事务介绍

目录

什么是事务

定义

举例

事务四个特性(ACID)

搭建事务操作环境

创建数据库表并添加数据

?创建 service,搭建 dao,完成对象创建和注入关系

service 注入 dao,在 dao 注入 JdbcTemplate,在 JdbcTemplate 注入 DataSource

在 dao 创建两个方法:多钱和少钱的方法,在 service 创建方法(转账的方法)

上面代码,如果正常执行是没有问题的,但是如果代码执行过程中出现异常,有问题

上面问题如何解决呢??使用事务进行解决

事务操作过程

Spring 事务管理介绍

?注解声明式事务管理

1、在 spring 配置文件配置事务管理器

2.在 spring 配置文件,开启事务注解

在 spring 配置文件引入名称空间 tx

开启事务注解 ?

3、在 service 类上面(或者 service 类里面方法上面)添加事务注解

?4.将两人的钱都修改为1000,再执行测试方法

注解声明式事务管理参数配置

XML 声明式事务管理

在 spring 配置文件中进行配置

第一步 配置事务管理器


什么是事务

定义

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

作都失败。

举例

银行转账

*? tom转账 100 元 给 jerry。

* tom?少 100,jerry?多 100。

事务四个特性(ACID

(1)原子性

(2)一致性

(3)隔离性

(4)持久性

关于事务的特性我们曾经在mysql的学习中介绍过,有不明白的小伙伴可以回顾一下我曾经写的这篇文章《数据库事务介绍(一)数据库事务的基本概念》

搭建事务操作环境

创建数据库表并添加数据

?创建 service,搭建 dao,完成对象创建和注入关系

service 注入 dao,在 dao 注入 JdbcTemplate,在 JdbcTemplate 注入 DataSource

这些操作,我们在上篇文章将如何使用JdbcTemplate的时候已经讲过了,这里不再赘述,而且我们用到的dao以及Service也还是上篇文章讲到的Service。如果有不明白的小伙伴可以去看上篇文章,而且我们这里用到的数据库表也是上篇文章的数据库表,这里只是增加了一个数据库字段money.

dao 创建两个方法:多钱和少钱的方法,在 service 创建方法(转账的方法)

Dao接口中声明两个方法
 void reduceMoney();//减钱
 void addMoney();//加钱
Dao实现类实现两个方法

  //少钱的方法
    @Override
    public void reduceMoney() {
        String sql = "update  t_man set money = 1000-? where user_name=?";
        jdbcTemplate.update(sql,100,"tom");
    }
//多钱的方法
    @Override
    public void addMoney() {
        String sql = "update  t_man set money = 1000+? where user_name=?";
        jdbcTemplate.update(sql,100,"jerry");
    }
Service中转账的方法
//    转账
    public void accountMoney(){
        dao.reduceMoney();//tom减100
        dao.addMoney();//jerry加100
    }

上面代码,如果正常执行是没有问题的,但是如果代码执行过程中出现异常,有问题

?

?在测试类中调用转账方法

此时我么发现tom钱少了,但是Jerry没多

上面问题如何解决呢??使用事务进行解决

事务操作过程

Spring 事务管理介绍

1、事务添加到 JavaEE 三层结构里面 Service 层(业务逻辑层)

2、在 Spring 进行事务管理操作

编程式事务管理和声明式事务管理(使用)

3、声明式事务管理

1)基于注解方式(使用)

(2)基于 xml 配置文件方式

4、在 Spring 进行声明式事务管理,底层使用 AOP 原理

5Spring 事务管理 API

提供一个接口,代表事务管理器,这个接口针对不同的框架提供不同的实现类

?注解声明式事务管理

1、在 spring 配置文件配置事务管理器

 <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"/>
    </bean>

2.在 spring 配置文件,开启事务注解

在 spring 配置文件引入名称空间 tx

开启事务注解 ?

 <tx:annotation-driven transaction-manager="transactionManager"></tx:annotation-driven>

3、在 service 类上面(或者 service 类里面方法上面)添加事务注解

(1)@Transactional,这个注解添加到类上面,也可以添加方法上面

(2)如果把这个注解添加类上面,这个类里面所有的方法都添加事务

(3)如果把这个注解添加方法上面,为这个方法添加事务

?4.将两人的钱都修改为1000,再执行测试方法

我们看到,异常还是会抛出但是由于我们使用了事务,我们的数据库是

注解声明式事务管理参数配置

?propagation:事务传播行为

?ioslation:事务隔离级别 ,我们之前在mysql的学习中介绍过事务的隔离级别,有兴趣的小伙伴可以去看一下这篇文章《数据库事务介绍(四)SQL中的四种隔离级别及其解决的并发问题》以及《数据库事务介绍(三)数据并发会产生的问题》

timeout:超时时间

(1)事务需要在一定时间内进行提交,如果不提交进行回滚

(2)默认值是 -1 ,设置时间以秒单位进行计算

readOnly:是否只读

(1)读:查询操作,写:添加修改删除操作

(2)readOnly 默认值 false,表示可以查询,可以添加修改删除操作

(3)设置 readOnly 值是 true,设置成 true 之后,只能查询

rollbackFor:回滚

设置出现哪些异常进行事务回滚

noRollbackFor:不回滚

设置出现哪些异常不进行事务回滚

XML 声明式事务管理

spring 配置文件中进行配置

第一步 配置事务管理器

这个之前已经配置过

第二步 配置通知

<!--    配置通知-->
    <tx:advice id="txadvice">
<!--        配置事务参数-->
        <tx:attributes>
            <!--指定哪种规则的方法上面添加事务-->
            <tx:method name="accountMoney" propagation="REQUIRED"/>
        </tx:attributes>
    </tx:advice>

第三步 配置切入点和切面


<!--    配置通知-->
    <tx:advice id="txadvice">
<!--        配置事务参数-->
        <tx:attributes>
            <!--指定哪种规则的方法上面添加事务-->
            <tx:method name="accountMoney" propagation="REQUIRED"/>
        </tx:attributes>
    </tx:advice>

    <aop:config>
<!--        配置切入点-->
        <aop:pointcut id="pp" expression="execution(* com.csdn.service.ManService.accountMoney(..))"/>
<!--        配置切面-->
        <aop:advisor advice-ref="txadvice" pointcut-ref="pp"></aop:advisor>
    </aop:config>

此时我们的去掉Service方法上的注解再执行测试方法

依然出现异常

但是数据库表

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-05-02 13:25:12  更:2022-05-02 13:25:21 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 2:03:01-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码