Spring事务操作-事务引入

目录

Spring事务操作-事务引入

1.模拟异常

2.测试异常

3.没有使用spring框架的时候异常该如何处理

4.使用spring框架的时候异常该如何处理

5.在spring 进行声明式事务管理,底层使用AOP

6.spring 事务管理API

7.事务操作(注解声明式事务管理)

(1)在spring的配置文件中配置事务管理器

(2)在spring 配置文件中,开启事务注解

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

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

(5)测试:


 

 上一章的代码,如果正常执行,   不会出现问题

 

如果在代码执行过程中出现异常,会出现问题

 

因此,我们引入事务这个概念

 

Spring事务操作-事务引入

 

1.模拟异常

在业务逻辑层中的service层中模拟异常

package org.example.spring.service;import org.example.spring.dao.UserDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;@Service
public class UserService {@Autowiredprivate UserDao userDao;//    转账方法调用public void accountMoney(){//lucy少100userDao.reduceMoney();//模拟异常int i=10/0;//mary多100userDao.addMoney();}}

 

2.测试异常

原来的数据库值:

后来的数据库值:

分析:lucy的钱少了,mary 的钱却没有增加

 

3.没有使用spring框架的时候异常该如何处理

package org.example.spring.service;import org.example.spring.dao.UserDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;@Service
public class UserService {@Autowiredprivate UserDao userDao;//    转账方法调用public void accountMoney(){
//            1.开启事务try{
//            2.进行业务操作//lucy少100userDao.reduceMoney();//模拟异常int i=10/0;//mary多100userDao.addMoney();//            3.没有发生异常,提交事务}catch(Exception e){
//            4.如果发生了异常,从第3跳到第4,进行事务回滚}}}

 

4.使用spring框架的时候异常该如何处理

(1)事务添加到javaEE三层结构里面的service层 (业务逻辑层)

(2)在spring 进行事务管理操作有两种方式:

【第一种】编程式事务管理:相当于3. 里面的操作

【第二种】声明式事务管理(常用):

1.基于注解方式(常用)

2.基于xml 配置方式

 

5.在spring 进行声明式事务管理,底层使用AOP

 

6.spring 事务管理API

(1)spring 提供了一个接口,代表是事务管理器(事务操作都封装在里面)

这个接口针对不同的框架提供不同的实现类,例如以下的红框就是整合JDBC框架的子类 实现类

 

7.事务操作(注解声明式事务管理)

(1)在spring的配置文件中配置事务管理器

<?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:context="http://www.springframework.org/schema/context"xmlns:aop="http://www.springframework.org/schema/aop"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"><!--    开启组件扫描--><context:component-scan base-package="org.example"></context:component-scan>
<!--数据库连接池--><bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" destroy-method="close"><property name="url" value="jdbc:mysql://localhost:3306/user_db?useSSL=false&amp;useUnicode=true&amp;characterEncoding=UTF-8"/><property name="username" value="root"/><property name="password" value="sise"/><property name="driverClassName" value="com.mysql.jdbc.Driver"/></bean><!--    创建jdbcTemplate对象--><bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<!--需要注入数据源信息--><property name="dataSource" ref="dataSource"></property></bean><!--    创建事务管理器-->
<bean id="dataSourceTransactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource" ref="dataSource"></property>
</bean>
</beans>

 

(2)在spring 配置文件中,开启事务注解

引入名称空间tx

开启事务注解

 

 

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

 

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

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

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

package org.example.spring.service;import org.example.spring.dao.UserDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;@Service
@Transactional
public class UserService {@Autowiredprivate UserDao userDao;//    转账方法调用public void accountMoney(){
//1.开启事务
//        try{
//            2.进行业务操作//lucy少100userDao.reduceMoney();//模拟异常int i=10/0;//mary多100userDao.addMoney();//            3.没有发生异常,提交事务//        }catch(Exception e){
//            4.如果发生了异常,从第3跳到第4,进行事务回滚//        }}}

 

 

(5)测试:

原来数据:

后来数据(不变):

只是在控制台提示报错信息:

 

 

 

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

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

相关文章

在r中rowsums_用R进行数据分析-05

20-矩阵与数组一、矩阵的定义矩阵&#xff08;Matrix&#xff09;是一个按照长方阵列排列的复数或实数集。向量是一维的&#xff0c;而矩阵是二维的&#xff0c;需要有行和列。R中&#xff0c;矩阵是有维数的向量&#xff0c;但元素必须拥有相同的模式&#xff0c;此和向量一致…

JAVA入门级教学之(super的内存示意)

Super的原理&#xff1a; 代表的是当前对象this的父类型特征 如果类加载过程中&#xff0c;这个类有静态代码块&#xff0c;有静态变量&#xff0c;一律都会执行&#xff0c;系统会先分配空间 只要方法调用&#xff0c;就一定会进行方法压栈 new一个方法&#xff0c;其实是调用…

JAVA入门级教学之(猜数字测试)

一个类A有一个实例变量v&#xff0c;从键盘接受一个正整数作为实例变量v的初始值 另外再定义一个类B&#xff0c;对类A的实例变量v进行猜测 如果大了则提示大了 如果小了则提示小了 等于则提示测试成功 猜测数字比大小的测试&#xff1a; /*** author LBJ* version V1.0* P…

硬盘突然提示没有初始化_新硬盘的分区

★前言如果你添加了一个新硬盘到电脑上&#xff0c;但是它没有在文件管理器中出现&#xff0c;你可能需要为它分配一个盘符&#xff0c;或者对它进行初始化并分区才能使用。★警告在分区时&#xff0c;”删除磁盘分区“和”格式化“都会清空该分区的数据&#xff0c;请提前备份…

JAVA入门级教学之(简单的程序测试)

请定义一个交通工具(Vehicle)类 其中有属性&#xff1a; 速度speed 体积size 方法移动move() 设置速度setSpeed(int speed) 加速speedUp() 减速speedDown() 最后在测试类Vehicle中的main() 中实例化一个交通工具对象&#xff0c;并通过方法给它初始化speed&#xff0c…

linux怎样判断线程是否暂停_怎样判断股市是否会继续下跌?

之前和大家分享了如何判断大市是否会上涨&#xff0c;这篇文章我再分享下如何判断大市是否会继续下跌。我们对大市的判断原则仍采用&#xff1a;基于技术分析判断危险信号&#xff0c;结合市场消息坐实。基于上一篇文章的基础如何判断股市是否会上涨&#xff1f;是否已跌到底&a…

html鼠标悬停效果_【开发小技巧】023—如何使用HTML和CSS实现3D文字效果

来源 | https://www.geeksforgeeks.org/create-a-3d-text-effect-using-html-and-css/3D文字效果是网页设计领域中最常用的文字效果之一。作为设计师或前端开发人员&#xff0c;应该知道如何创建3D文字效果。今天&#xff0c;我们将研究一种最简单易用的方法来实现3D文字外观。…

JAVA进阶教学之(Object类的toString方法)

1.toString public String toString() 返回对象的字符串表示形式。总的来说&#xff0c;这 toString方法返回一个字符串&#xff0c;“以文本方式表示”这个对象。其结果应该是一个简洁&#xff0c;但详实的代表性&#xff0c;是一个容易阅读的人。 建议所有子类都重写此方法…

java ftp获取文件名的方法_小猿圈Java学习-URL地址的组成格式

URL的全称是Uniform Resource Locator&#xff0c;意思是统一资源定位符&#xff0c;俗称网络地址或网址。网络上的每个文件及接口&#xff0c;都有对应的URL网址&#xff0c;它规定了其他设备如何通过一系列的路径找到自己&#xff0c;犹如网购的包裹一路送至收货地址所描述的…

JAVA进阶教学之(Object类中的equals方法)

public boolean equals(Object obj){return (this obj); } 原始equals方法是判断两个对象的内存地址是否相等的&#xff08;内存地址相等&#xff0c;保存的值也相等&#xff09; 比较是判断两个对象的值是否相等&#xff08;保存的值相等&#xff09; 在Object类中的equal…

hashmap扩容机制_图文并茂:HashMap经典详解!

点击上方 Java后端&#xff0c;选择 设为星标优质文章&#xff0c;及时送达代码中的注解多看几遍&#xff0c;其中HashMap的扩容机制是要必懂知识&#xff01;结合图片一起理解&#xff01;什么是 HashMap?HashMap 是基于哈希表的 Map 接口的非同步实现。此实现提供所有可选的…

JAVA进阶教学之(Object类中的hashCode方法)

import java.util.Objects;/* hashCode方法 在Object中的hashCode方法是怎样的&#xff1f; public native int hashCode(); 这个方法不是抽象方法&#xff0c;带有native关键字&#xff0c;底层调用的是c程序hashCode() 方法返回的是int类型的哈希码 实际上就是一个java对象的…

nfc加密卡pm3和pm5区别_小米手环4/5 NFC添加加密门禁

什么是 NFC近场通信技术(Near-field communication&#xff0c;NFC)由非接触式射频识别(RFID)演变而来&#xff0c;由飞利浦半导体(现恩智浦半导体)、诺基亚和索尼共同于2004年研制开发&#xff0c;其基础是RFID及互连技术。近场通信是一种短距高频的无线电技术&#xff0c;在1…

python图书管理系统增删改查_固定资产管理系统,高效管理企业资产

固定资产管理系统是面向资产密集型单位信息化解决方案的总称&#xff0c;是一款通用性极强的管理软件&#xff0c;能够对单位所有的固定资产进行全方位掌控&#xff0c;并规范其管理流程&#xff0c;适用于企业、机关、学校、医院等单位。系统围绕固定资产的“进、出、用”各个…

JAVA进阶教学之(一维数组)

1、java语言中的数组是一种引用数据类型。不属于基本数据类型 数组的父类是object 2、数组实际上是一个容器&#xff0c;可以同时容纳多个元素&#xff08;数组是一个数据的集合&#xff09; 3、字面意思&#xff1a;数组意味着一组数据 4、数组当中可以存储“基本数据类型”的…

python画五角星填充不同颜色_不同颜色牡丹怎么画?3种牡丹图解教你画,适合0基础学习,收藏...

不同颜色的牡丹画法【黄牡丹】1 选取小号羊毫笔&#xff0c;笔肚先蘸取白粉&#xff0c;再在笔尖蘸藤黄稍加调和&#xff0c;运用斡水法&#xff0c;瓣片环花心而发&#xff0c;第一层花瓣要成弧形排列。2 再在笔尖上蘸藤黄&#xff0c;待蘸饱后&#xff0c;笔尖向内&#xff0…

JAVA进阶开发之(二维数组)

1、二维数组其实是一个特殊的一维数组&#xff0c;特殊在这个二维数组中每一个元素是一个一维数组 2、就是一维数组里面都是一样的元素&#xff0c;二维数组就是把元素换成了一维数组 3、实际开发中&#xff0c;使用最多的就是一维数组&#xff0c;二维数组很少使用&#xff0c…

python语言中包含的标准数据类型_Python对象——标准类型的分类

如果让我们最啰嗦的描述标准类型&#xff0c;我们也许会称它们是Python 的“基本内建数据对象原始类型”。 z “基本”&#xff0c;是指这些类型都是Python 提供的标准或核心类型。 z “内建”&#xff0c;是由于这些类型是Python 默认就提供的 z “数据”&#xff0c;因为他们…

JAVA进阶级开发之(Array工具类)

目录 常见的算法&#xff1a; 1、排序算法&#xff1a; 2、查找算法&#xff1a; 3、算法&#xff1a; 4、冒泡排序算法&#xff08;理论&#xff09; 4、选择排序算法&#xff08;理论&#xff09; 5、数组的元素查找&#xff1a; 6、介绍一下java.util.Arrays工具类 …

css怎么使元素绝对定位有过度效果_CSS定位属性Position实例分析

CSS所提供的Position定位属性在进行网页页面布局过程中非常重要&#xff0c;通过使用Position定位属性可以实现对页面元素进行精确定位&#xff0c;最终达到较好的设计及页面展示效果。本文主要针对Position属性设计教学案例&#xff0c;实现教学。CSS学习教程Position定位属性…