Spring事务

hi,大家好,今天为大家带来Spring事务相关介绍
在这里插入图片描述

🧊1.为什么要学事务

情景假设:疯驴子给王麻子转账100万,点击转账以后,界面突然黑屏了,那么疯驴子不知道王麻子收到钱还是没收到,所以转账和收款全部都一起成功或者一起失败,这就是事务的作用,保证了数据的完整性和一致性

🧊2.事务的定义

事务是指一系列操作或事件的集合,通常用于执行一项特定的任务或完成一项特定的工作。在计算机领域,事务通常是指一组数据库操作,这些操作要么全部执行成功,要么全部失败回滚,以保证数据的完整性和一致性。

🧊3.Spring事务的实现

Spring’事务的实现分为两种
1.Spring编程事务 2.Spring声明式任务

👀3.1Mysql事务的使用

事务在MySQL有三个操作:开启事务、提交事务、回滚事务

-- 开启事务
start transaction;
-- 业务执⾏
---
-- 提交事务
commit;
-- 回滚事务
rollback;

👀3.2Spring编程事务(手动)

@Service
public class MyService {@Autowiredprivate MyDao myDao;@Transactionalpublic void doTransactionalOperation(){// some code here}
}@Repository
public class MyDao {@Autowiredprivate JdbcTemplate jdbcTemplate;public void saveData(String data) {String sql = "INSERT INTO my_table (data) VALUES (?)";jdbcTemplate.update(sql, data);}
}

在这个示例中,MyService类是一个Spring的@Service组件,该组件中包含了一个需要进行事务处理的方法doTransactionalOperation()。@Transactional注解指示Spring在该方法执行期间实现事务。

MyDao类是一个Spring的@Repository组件,包含了与数据库相关的操作。在saveData()方法中调用了JdbcTemplate的update()方法将数据插入到数据库中。

通过Spring的事务管理器,当MyService的doTransactionalOperation()方法被调用时,Spring将采取一系列措施,包括开启事务、执行方法、提交或回滚事务。

👀3.3Spring声明式事务(自动)

声明式事务很简单,在方法上或者类上添加@Transactional注解就可以实现
我们来用代码举个例子,

package com.example.demo.model;import lombok.Data;import java.time.LocalDateTime;@Data
public class Userinfo {private int id;private String username;private  String password;private  String photo;private LocalDateTime createtime;private  LocalDateTime updatetime;private int state;
}
package com.example.demo.mapper;import com.example.demo.model.Userinfo;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Mapper;@Mapper
public interface UserMapper {@Insert("insert into userinfo(username,password) values(#{username},#{password})")int add(Userinfo userinfo);
}
package com.example.demo.service;import com.example.demo.mapper.UserMapper;
import com.example.demo.model.Userinfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;@Service
public class UserService {@Autowiredprivate UserMapper userMapper;public int  add(Userinfo userinfo){return    userMapper.add(userinfo);}
}
package com.example.demo.controller;import com.example.demo.model.Userinfo;
import com.example.demo.service.UserService;
import org.apache.catalina.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.util.pattern.PathPattern;//测试类@RestController@RequestMapping("/user")
public class UserController {@Autowiredprivate UserService userService;@RequestMapping("/add")@Transactionalpublic  int  add(){Userinfo userinfo=new Userinfo();userinfo.setUsername("疯驴子");userinfo.setPassword("123");int result=    userService.add(userinfo);System.out.println("受影响的行数是"+result);int num=10/0;return 0;}
}

运行
在这里插入图片描述
不出意外的报错了,然后看看后台
在这里插入图片描述
数据库结果:
在这里插入图片描述
这个既完成了插入的测试,又没有插入到数据库里面,这就是@Transactional注解的强大力量:当修饰的方法或者类发生异常的时候自动回滚事务

👀3.4@Transactional注解作用范围

修饰⽅法时:只能应⽤到 public ⽅法上,否则不⽣效。
修饰类时:表明该注解对该类中所有的 public ⽅法都⽣效。

👀3.5@Transactional注解参数

参数作用
isolation设置事务的隔离级别,默认为DEFAULT。
propagation设置事务的传播行为,默认为REQUIRED
timeout设置事务的超时时间,默认为-1,表示不超时
readOnly设置事务的只读属性,默认为false
rollbackFor设置需要回滚的异常类型,可以设置多个
noRollbackFor设置不需要回滚的异常类型,可以设置多个
value作用同于别名name,用于指定事务的名称
name作用同于别名value,用于指定事务的名称

👀3.6@Transactional注意事项

@Transactional在异常被捕获的情况下不会进行事务自动回滚,因为捕获异常,动态代理就感知不到异常了,认为没有异常,自然就不会回滚
在这里插入图片描述

在这里插入图片描述
解决办法:
1.把异常继续抛出,代理对象就可以感受到异常
从而自动回滚事务
在这里插入图片描述
2.⼿动回滚事务,在⽅法中使用TransactionAspectSupport.currentTransactionStatus() 可以得到当前的事务,然后设置回滚⽅法 setRollbackOnly 就可以实现回滚

    try{int num=10/0;}catch (Exception e){//throw e;TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();}

👀3.7@Transactional工作原理

@Transactional 是基于 AOP 实现的,AOP ⼜是使用动态代理实现的。如果目标对象实现了接口,默认情况下会采用 JDK 的动态代理,如果目标对象没有实现了接口,会使用CGLIB动态代理

@Transactional 在开始执行业务之前,通过代理先开启事务,在执行成功之后再提交事务。如果中途遇到异常,则回滚事务

如果该注解被应用于类级别,则该类中的所有方法都将受到该注解的影响,即所有方法都将在同一个事务中执行。

总之,@Transctional注解的工作原理是通过在方法执行前创建事务,并在方法执行后根据执行结果提交或回滚事务来确保数据的一致性。但需要注意的是,该注解只能用于Spring管理的Bean对象中,否则无效。
在这里插入图片描述

🧊4.事务隔离级别

👀4.1事务特性回顾

事务有四大特性:原子性,持久性,一致性,隔离性

原子性(Atomicity)一组操作作为一个整体,要么全部执行成功,要么全部失败回滚。
一致性(Consistency):事务执行前后,数据必须保持一致状态。即,如果事务执行成功,则数据状态必须符合约束条件,否则事务将回滚。
隔离性(Isolation):事务的执行必须与其他事务隔离,以防止并发事务的相互影响。通常有四种隔离级别:读未提交、读已提交、可重复读和串行化。
持久性(Durability):一旦事务执行成功,它对数据库的影响应该是永久性的,即使系统崩溃也不应该丢失数据。

只有隔离性(隔离级别)是可以设置的,为了保证多个并发事务的执行安全,确保数据库的数据完整性、一致性和并发性.

👀4.2Mysql事务隔离级别

MySQL事务隔离级别有4种

1.READ UNCOMMITTED:读未提交

最低级别,允许一个事务读取另一个事务还未提交的数据。

2. READ COMMITTED:读已提交

允许一个事务读取另一个已经提交的事务的数据。

3. REPEATABLE READ:可重复读

可重复读,是 MySQL 的默认事务隔离级别,它能确保同⼀事务多次查询的结果⼀致

4.SERIALIZABLE:序列化

最高级别,所有事务串行执行,保证数据的完整性和一致性,但并发性能较差。

🐶!!!重点来了
1.什么是幻读?
2.RR解决幻读问题了吗?
3.咋样解决的?

什么是幻读

幻读是指在并发访问数据库时,一个事务多次查询同一数据集合时,其他事务插入或删除了数据,导致该事务前后两次查询结果不一致的现象
幻读不是重复读的现象,是查询到了不同的数据

RR解决幻读问题了吗

RR解决了部分幻读问题

咋样解决的?

🤔采用RR+MVCC(多版本并发控制)来解决幻读问题
幻读分为当前读和快照读

当前读:MVCC解决不了,进行当前读时,可能会读取到正在被修改的数据,这样可能会导致读取到不一致的数据.

解决办法:采用锁来解决,当前事务执行完释放锁,其余的事务再执行

快照读:MVCC可以解决,MVCC会为每个事务创建一个版本号,所有对数据的修改都会创建新的版本号。可以在读取数据时返回之前的版本,这个版本是在读取之前提交的,以保证数据的一致性.

🐷彻底解决幻读:
1.使用串行化隔离级别
2.RR+加锁,RR级别下加锁,开启事务就加锁,其他事务在操作此表的相关数据时,就只能等待锁释放(事务一提交或回滚锁自动释放)

当前读:数据库中一种读取数据的方式,它读取最新提交的数据
快照读:快照读是指在读取数据时,读取的是在事务开始前提交的快照数据,而不是当前的数据。如果数据在事务中发生了更新操作,快照读会读取到旧的数据,这会导致数据不一致性问题。

👀4.3Spring设置事务隔离级别

在这里插入图片描述

👀4.4Spring事务隔离级别

Spring 事务隔离级别有 5 种

Isolation.DEFAULT(默认):以连接的数据库的事务隔离级别为主
Isolation.READ_UNCOMMITTED(读未提交):最低的隔离级别,事务可以看到其他未提交的事务所做的修改
Isolation.READ_COMMITTED(读已提交):读取已提交的数据,一个事务只能看到其他事务已经提交的数据;

Isolation.REPEATABLE_READ(可重复读):同一个事务中多次读取同一个数据总是相同,不会受其他事务的影响;
Isolation.SERIALIZABLE(串行化):最高的隔离级别,所有事务都像串行执行一样,避免任何并发问题。

今天的讲解就到这里 ,我们下期再见了,886~在这里插入图片描述

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

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

相关文章

HTTP和HTTPS协议

目录 一、HTTP和HTTPS区别🌻 二、有了https还有使用http场景吗🍊 三、https协议的工作原理💥 四、https协议的优点和缺点🍞 一、HTTP和HTTPS区别🌻 HTTP(Hypertext Transfer Protocol)和HTT…

opencv图片灰度二值化

INCLUDEPATH D:\work\opencv_3.4.2_Qt\include LIBS D:\work\opencv_3.4.2_Qt\x86\bin\libopencv_*.dll #include <iostream> #include<opencv2/opencv.hpp> //引入头文件using namespace cv; //命名空间 using namespace std;//opencv这个机器视…

学习笔记整理-面向对象-03-构造函数

一、构造函数 1. 用new调用函数的四步走 new 函数();JS规定&#xff0c;使用new操作符调用函数会进行"四步走"&#xff1a; 函数体内会自动创建出一个空白对象函数的上下文(this)会指向这个对象函数体内的语句会执行函数会自动返回上下文对象&#xff0c;即使函数没…

2000-2022年全国各地级市绿色金融指数数据

2000-2022年全国各地级市绿色金融指数数据 1、时间&#xff1a;2000-2022年 2、来源&#xff1a;来源&#xff1a;统计局、科技部、中国人民银行等权威机构网站及各种权威统计年鉴&#xff0c;包括全国及各省市统计年鉴、环境状况公报及一些专业统计年鉴&#xff0c;如 《中国…

React 入门学习

React 入门 一、基本认识1.1、前言1.2、什么是1.3、编译<br>1.4、特点1.5、高效 二、React环境和基本使用2.1、环境搭建2.2、脚手架项目基本使用2.2.1、src2.2.2、public2.2.3、package.json 三、JSX的理解和使用四、模块与模块化, 组件与组件化的理解4.1、模块与组件4.2…

第一次PR经历

第一次PR测试地址&#xff1a;https://github.com/firstcontributions/first-contributions说明文档&#xff1a; https://github.com/firstcontributions/first-contributions/blob/main/translations/README.zh-cn.md

uniapp+uview封装小程序请求

提要&#xff1a; uniapp项目引入uview库 此步骤不再阐述 1.创建环境文件 env.js&#xff1a; let BASE_URL;if (process.env.NODE_ENV development) {// 开发环境BASE_URL 请求地址; } else {// 生产环境BASE_URL 请求地址; }export default BASE_URL; 2.创建请求文件 该…

理解持续测试,才算理解DevOps

软件产品的成功与否&#xff0c;在很大程度上取决于对市场需求的及时把控&#xff0c;采用DevOps可以加快产品交付速度&#xff0c;改善用户体验&#xff0c;从而有助于保持领先于竞争对手的优势。 作为敏捷开发方法论的一种扩展&#xff0c;DevOps强调开发、测试和运维不同团队…

2014-2022年阿里淘宝村省市县数据

2009-2022年阿里淘宝村-省市县数据&#xff08;原始数据汇总&#xff09; 从萌芽到扩散&#xff0c;再到大规模、集群式增长&#xff0c;生机勃勃的“淘宝村”和“淘宝镇”已成为中国农村电商发展的典范。2022年&#xff0c;在全面推动乡村振兴的进程中&#xff0c;又有一批村…

xxljob搭建(内网穿透)

调度中心搭建 先从码云或者github上将项目拷贝到本地&#xff0c;选择最新的release分支拷贝下来的xxl-job-admin模块就是调度中心&#xff0c;我们需要做的有两点&#xff0c;第一点将doc/db/tables_xxl_job.sql执行&#xff0c;第二点修改xxl-job-admin的application.proper…

IDC报告深度解读:2023年CRM发展趋势分析

近期&#xff0c;国际数据公司&#xff08;IDC&#xff09;发布了2022年下半年《中国客户关系管理(CRM)SaaS市场跟踪研究报告》&#xff0c;根据报告显示&#xff0c;2022年下半年中国CRM SaaS市场规模达到 11.6 亿美金&#xff0c;同比增长25.4%&#xff0c;CRM占中国整体SaaS…

关于面试的那点事,我想说……

最近有许多公司的陆陆续续开始秋招了&#xff0c;但有不少粉丝像我说吐槽秋招难。实话实说现在确实有点难&#xff0c;要在以前Android 开发岗位的工作遍地都是&#xff0c;而且面试问的也比较简单&#xff0c;到手的Offer任意选。可惜如今市场变咯&#xff0c;岗位需求量在减少…