你了解Spring事物控制特性吗

简介: 一.事务特性原子性:强调事务的不可分割一致性:强调的是事务的执行的前后,数据的完整性要保持一致隔离性:一个事务的执行不应该受到其他事务的干扰持久性:事务一旦结束(提交/回滚)数据就持久保持到了数据库二.如果不考虑隔离性,会引发一些安全性问题读问题脏读:一个事务读到另一个事务还没有提交的数据不可重复读:一个事务读到了另一个事务已经提交的update数据,导致在当前的事务中多次查询数据不一致虚读/幻读:一个事务读到另一个事务已经insert数据,导致当前事务中多次查询结果不一致写问题引发两类丢失更新三.解决引发的读问题设置事务的隔离级别read uncommitted :未提交读。

一.事务特性
原子性:强调事务的不可分割
一致性:强调的是事务的执行的前后,数据的完整性要保持一致
隔离性:一个事务的执行不应该受到其他事务的干扰
持久性:事务一旦结束(提交/回滚)数据就持久保持到了数据库

二.如果不考虑隔离性,会引发一些安全性问题
读问题
脏读:一个事务读到另一个事务还没有提交的数据
不可重复读:一个事务读到了另一个事务已经提交的update数据,导致在当前的事务中多次查询数据不一致
虚读/幻读:一个事务读到另一个事务已经insert数据,导致当前事务中多次查询结果不一致

写问题
引发两类丢失更新

三.解决引发的读问题
设置事务的隔离级别
read uncommitted :未提交读。脏读,不可重复读,虚读都可能发生
read committed :已提交读。避免脏读,不可重复读和虚度有可能发生
repeatable read :可重复读。避免脏读和不可重复读,虚读可能发生
serializable :串行化的。避免脏读,不可重复读,虚读的发生

select @@tx_isolation; 查看隔离级别
set session transaction isolation level 级别; 设置隔离级别

四.演示读问题
演示脏读
分别开启两个dos窗口 A.B
先查看两个窗口的隔离级别 select @@tx_isolation;
设置A窗口的隔离级别为未提交读 set session transaction isolation level read uncommitted;
分别在两个窗口开启事务 start transaction;
分别开启两个dos窗口 A.B
update account set money = money - 1000 where name = ‘张森’;
update account set money = money + 1000 where name = ‘凤姐’;
在A窗口查询数据 select * from account; – A事务读到了B事务还没有提交的数据;

演示避免脏读,演示不可重复读发送
分别开两个窗口,A.B
设置A窗口的隔离级别:read committed set session transaction isolation level read committed;
分别在两个窗口开启事务 start transaction;
在B窗口完成转账
update account set money = money - 1000 where name = ‘张森’;
update account set money = money + 1000 where name = ‘凤姐’;
在A窗口进行查询 select * from account; – 避免脏读
在B窗口提交事务 commit;
在A窗口中再次查询 select * from account; – 转账成功.(不可重复读:一个事务读到另一个事务中已经提交的update的数据,导致多次查询结果不一致.)

避免脏读和不可重复读,演示虚读
分别开启两个窗口,A.B
设置A窗口的隔离级别:repeatable read set session transaction isolation level repeatable read;
分别在两个窗口中开启事务 start transaction;
在B窗口完成转账的操作
update account set money = money - 1000 where name = ‘张森’;
update account set money = money + 1000 where name = ‘凤姐’;
在A窗口查询 select * from account; – 转账没有成功:避免脏读.
在B窗口提交事务 commit;
在A窗口再次查询 select * from account; – 转账没有成功:避免不可重复读.

避免虚读
分别开启两个窗口,A.B
设置A窗口的隔离级别:repeatable read set session transaction isolation level repeatable read;
分别在两个窗口中开启事务 start transaction;
在B窗口完成插入操作 insert into account values (null,‘王老师’,10000);
在A中进行查询操作 select * from account; – 没有查询到任何结果
在B窗口提交事务 commit; – A窗口马上就会显示数据

喜欢这篇文章的可以给笔者点个赞同,关注一下,每天都会分享Java相关文章!还有不定时的福利赠送,包括整理的学习资料,面试题,源码等~~

相关文章
|
4月前
|
存储 监控 Java
|
3月前
|
JSON Dubbo Java
微服务框架(二十)Dubbo Spring Boot 生产就绪特性
  此系列文章将会描述Java框架Spring Boot、服务治理框架Dubbo、应用容器引擎Docker,及使用Spring Boot集成Dubbo、Mybatis等开源框架,其中穿插着Spring Boot中日志切面等技术的实现,然后通过gitlab-CI以持续集成为Docker镜像。   本文为Dubbo Spring Boot 生产就绪特性
|
2月前
|
设计模式 前端开发 Java
玩转Spring—Spring5新特性之Reactive响应式编程实战
玩转Spring—Spring5新特性之Reactive响应式编程实战
59 0
|
3月前
|
前端开发 Java 开发者
Spring 6 的新特性:HTTP Interface
【1月更文挑战第11天】Spring 6 带来了一个新的特性——HTTP Interface。这个新特性,可以让开发者将 HTTP 服务,定义成一个包含特定注解标记的方法的 Java 接口,然后通过对接口方法的调用,完成 HTTP 请求。
98 2
|
4月前
|
网络协议 Java Spring
java spring boot2.5的新特性
java spring boot2.5的新特性
52 0
|
1月前
|
消息中间件 运维 监控
|
4月前
|
XML Java 数据格式
深入了解 Spring Boot 核心特性、注解和 Bean 作用域
Spring Boot 是基于 Spring Framework 构建应用程序的框架,Spring Framework 是一个广泛使用的用于构建基于 Java 的企业应用程序的开源框架。Spring Boot 旨在使创建独立的、生产级别的 Spring 应用程序变得容易,您可以"只是运行"这些应用程序。
66 0
|
4月前
|
设计模式 Java 程序员
深入理解spring的两大特性 ioc 和aop
深入理解spring的两大特性 ioc 和aop
53 0
|
4月前
|
Dubbo Java Docker
微服务框架(一)Spring Boot + Dubbo + Docker 框架特性简述
  此系列文章将会描述Java框架Spring Boot、服务治理框架Dubbo、应用容器引擎Docker,及使用Spring Boot集成Dubbo、Mybatis等开源框架,其中穿插着Spring Boot中日志切面等技术的实现,然后通过gitlab-CI以持续集成为Docker镜像。 本文为此微服务框架的特性简述。 本系列文章中所使用的框架版本为Spring Boot 2.0.3-RELEASE,Spring 5.0.7-RELEASE,Dubbo 2.6.2。
微服务框架(一)Spring Boot + Dubbo + Docker 框架特性简述
|
6月前
|
Java 程序员 数据库
Spring系列(二)之AOP的特性
Spring系列(二)之AOP的特性