Spring(3) --事务,隔离级别,设计模式
什么是事务?事物的四大特性?
事务是指单个逻辑工作单元执行的一系列操作(ACID),这些操作要么全部执行,要么全部不执行,是不可中断的。
(1)原子性(Atomicity)是指事务所有操作是不可中断的,要么全部执行成功,要么全部失败回滚。
(2)一致性(Consistency)是指一个事务执行之前和执行之后都必须处于一致性状态。eg:拿转账来说,假设用户A和用户B两者的钱加起来一共是5000,那么不管A和B之间如何转账,转几次账,事务结束后两个用户的钱相加起来应该还得是5000,这就是事务的一致性。
(3)隔离性(Isolation)一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。eg:操作同一张表时,数据库为每一个用户开启事务,多个并发事务的操作互不干扰,相互隔离。
(4)持久性(Durability)也称永久性(permanence),指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。接下来的其他操作或故障不应该对其有任何影响。
你使用过Spring的事务吗?是怎么用的?
Spring管理事务有两种方式:
(1)编程式事务:在代码中硬编码(不推荐使用)
(2)声明式事务:在配置文件中配置,声明式事务又分为两种:基于XML的方式和基于注解的方式(推荐使用),在项目中使用Spring的事务只需要在你需要事务的方法上加上@Transactional注解,那么这个方法就加上了事务,如果遇到异常,整个方法中的数据修改的逻辑都会被回滚掉,避免造成数据的不一致性。
实战:WKD中删除,保存等实现类中使用到。

补充说明:
@Transactional默认的事务传播行为Propagation.REQUIRED
@Transactional默认的隔离级别为Isolation.DEFAULT
Spring事务有哪几种事务传播行为吗?
在TransactionDefinition中定义了7种事务传播行为:
支持当前事务的情况:
(1) PROPAGATION_REQUIRED:如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务。
(2) PROPAGATION_SUPPORTS:如果当前存在事务,则加入该事务;如果当前没有事务,则以非事务的方式继续运行。
(3) PROPAGATION_MANDATORY:如果当前存在事务,则加入该事务;如果当前没有事务,则抛出异常(mandatory:强制)
不支持当前事务的情况:
(4) PROPAGATION_REQUIRES_NEW:创建一个新的事务,如果当前存在事务,则把当前事务挂起(暂停)。
(5) PROPAGATION_NOT_SUPPORTED:以非事务的方式运行,如果当前存在事务,则把当前事务挂起(暂停)。
(6) PROPAGATION_NEVER:以非事务的方式运行,如果当前存在事务,则抛出异常。
其他情况:
(7) PROPAGATION_NESTED:如果当前存在事务,则创建一个事务作为当前事务的嵌套(NESTED)事务来运行;如果当前没有事务,则该取值等价于PROPAGATION_REQUIRED。
Spring的事务有哪几种隔离级别?
TransactionDefinition接口中定义了五个隔离级别的常量:
(1)ISOLATION_DEFAULT:底层数据库存储的默认隔离级别,其他级别对应于JDBC隔离级别,eg:MySQL默认采用的是REPEATABLE_READ隔离级别,Oracle默认采用的是READ_COMMITTED隔离级别。
(2)ISOLATION_READ_UNCOMMITTED:最低的隔离级别,允许读取尚未提交的数据,可能导致脏读、幻读或不可重复读。
(3)ISOLATION_READ_COMMITTED:允许读取并发事务以及提交的数据,可以阻止脏读,但是幻读或不可重复读仍有可能发生。
(4)ISOLATION_REPEATABLE_READ:对同一字段的多次读取结果都是一致的,除非数据是被事务自己修改的,可以阻止脏读和不可重复读,但幻读仍有可能发生。
(5)ISOLATION_SERIALIZABLE:最高的隔离级别,所有事务依次逐个执行,这样事务之间就完全不可能产生干扰,也就是说,该级别可以防止脏读、不可重复读和幻读。但是这将严重影响程序性能,通常也不会用到。
补充介绍:
脏读:又称无效数据的读出,是指在数据库访问中,事务T1将某一值修改,但修改还没有提交到数据库中,然后事务T2读取该值,此后T1因为某种原因撤销对该值的修改,这就导致了T2所读取到的数据是无效的。
幻读:是指当事务不是独立执行时发生的一种现象,例如第一个事务对一个表中的数据进行了修改,比如这种修改涉及到表中的“全部数据行”。同时,第二个事务也修改这个表中的数据,这种修改是向表中插入“一行新数据”。那么,以后就会发生操作第一个事务的用户发现表中还存在没有修改的数据行,就好象发生了幻觉一样.一般解决幻读的方法是增加范围锁RangeS,锁定检索范围为只读,这样就避免了幻读。
不可重复读,是指在数据库访问中,一个事务范围内两次相同的查询却返回了不同数据。更简单的理解就是多次读同一个数据。在这个事务还没有结束时,另一个事务也访问该同一数据并修改数据。那么,在第一个事务的两次读数据之间。由于另一个事务的修改,那么第一个事务两次读到的数据可能不一样,这样就发生了在一个事务内两次读到的数据是不一样的,因此称为不可重复读,即原始读取不可重复。
Spring用了哪些设计模式?
1)工厂模式:Spring使用工厂模式通过BeanFactory、ApplicationContext创建Bean对象。
2)单例模式: 在Spring配置文件中定义的bean默认是单例模式。
3)适配器模式:Spring AOP的增强或通知使用到了适配器模式。SpringMVC中也是用到了适配器模式适配Controller。
4)装饰器模式:项目需要连接多个数据库,这种模式让我们可以根据客户需求切换不同的数据源。
5)代理模式:Spring AOP功能的实现。
6)观察者模式:Spring事件驱动模型就是观察者模式很经典的一个应用。
7)策略模式
8)模板模式:Spring中jdbcTemplate、hibernateTemplate等以Template结尾的对数据库操作的类,就是用到了模板模式。
Spring使用ThreadLocal解决线程安全问题
我们知道在一般情况下,只有无状态的Bean才可以在多线程环境下共享,在Spring中,绝大部分Bean都可以声明为singleton作用域。就是因为Spring对一些Bean(如RequestContextHolder、TransactionSynchronizationManager、LocaleContextHolder等)中非线程安全状态采用ThreadLocal进行处理,让它们也成为线程安全的状态,因为有状态的Bean就可以在多线程中共享了。
常见面试题?
(1) 你使用过Spring的事务吗?是怎么用的?
(2) Spring事务有哪几种事务传播行为吗?
(3)Spring的事务有哪几种隔离级别?
(4) Spring用了哪些设计模式?
(5) Spring怎么解决线程安全问题?
参考/好文
(1) 书籍 -- SpringBoot实战 -- 汪云飞 编著
(2) 聊一聊Spring中的线程安全性 --
https://juejin.im/post/5a0045ef5188254de169968e
(3)《今天面试了吗》 - Spring
https://juejin.im/post/5e6d993cf265da575b1bd4af
(4) 拉钩课程 -- Java源码剖析
https://kaiwu.lagou.com/course/courseInfo.htm?courseId=59
Spring(3) --事务,隔离级别,设计模式的更多相关文章
- Spring随笔 - 事务隔离级别
Spring提供5中事务隔离级别: ISOLATION_DEFAULT:使用数据库后端的默认隔离级别. ISOLATION_READ_UNCOMMITTED:允许读取尚未提交的数据变更.可能会导致脏读 ...
- 浅谈Spring的事务隔离级别与传播性
浅谈Spring的事务隔离级别与传播性 这篇文章以一个问题开始,如果你知道答案的话就可以跳过不看啦@(o・ェ・)@ Q:在一个批量任务执行的过程中,调用多个子任务时,如果有一些子任务发生异常,只是回滚 ...
- MySQL事务隔离级别测试实例
https://www.cnblogs.com/huanongying/p/7021555.html MySQL事务隔离级别 事务隔离级别 脏读 不可重复读 幻读 读未提交(read-uncommit ...
- spring事务隔离级别、传播机制以及简单配置
转自 https://blog.csdn.net/zht741322694/article/details/78676964 一.spring支持的事务声明方式1. 编程式事务 当系统需要明确的, ...
- Spring事务隔离级别和传播特性
相信每个人都被问过无数次Spring声明式事务的隔离级别和传播机制吧!今天我也来说说这两个东西. 加入一个小插曲, 一天电话里有人问我声明式事务隔离级别有哪几种, 我就回答了7种, 他问我Spring ...
- 浅谈Spring事务隔离级别
一.Propagation (事务的传播属性) Propagation : key属性确定代理应该给哪个方法增加事务行为.这样的属性最重要的部份是传播行为.有以下选项可供使用:PROPAGATION_ ...
- Spring事务配置的五种方式和spring里面事务的传播属性和事务隔离级别
转: http://blog.csdn.net/it_man/article/details/5074371 Spring事务配置的五种方式 前段时间对Spring的事务配置做了比较深入的研究,在此之 ...
- 事务隔离级别与传播机制,spring+mybatis+atomikos实现分布式事务管理
1.事务的定义:事务是指多个操作单元组成的合集,多个单元操作是整体不可分割的,要么都操作不成功,要么都成功.其必须遵循四个原则(ACID). 原子性(Atomicity):即事务是不可分割的最小工作单 ...
- Spring事务隔离级别与传播机制详解,spring+mybatis+atomikos实现分布式事务管理
原创说明:本文为本人原创作品,绝非他处转载,转账请注明出处 1.事务的定义:事务是指多个操作单元组成的合集,多个单元操作是整体不可分割的,要么都操作不成功,要么都成功.其必须遵循四个原则(ACID). ...
随机推荐
- XDown单文件版 下载工具 支持磁力等多种链接方式下载
原来的程序不带剪辑板探测,不支持迅雷链接等 增加功能后优化制作单文件版本. 下载类型为下图 magnet:?xt=urn:btih:836A228D932EF1C7EA1DD99D5D80B7CB0C ...
- 6、Sping Cloud Feign
1.Spring Cloud Feign简介 (1).Fegin简介 官方文档:http://projects.spring.io/spring-cloud/spring-cloud.html#spr ...
- Springboot集成xxl-Job
一.前言 xxl-job一个轻量级的分布的调度中间件,详情介绍自己到官网看:https://www.xuxueli.com/xxl-job/ 二.客户端(执行器) 引入依赖compile group: ...
- 【java】JSON.toJSONString 空对象也可以转化为JSON字符串
<dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifac ...
- 计算机语言与JAVA的发展
计算机语言与JAVA的发展 第一代语言 2进制 第二代语言 汇编语言 解决人类无法读懂的问题 指令替代二进制 目前应用 逆向工程 机器人 病毒 第三代语言 摩尔定律 性能提升愈来愈慢 高级语言 面向过 ...
- STL—— 容器(vector)begin() 与 rbegin() , end() 与 rend()
1. Vector 迭代器首地址与尾地址 begin() 和 end() 在代码中可以将迭代器用作参数的位置可以使用 begin() 和 end() 获取地址,如下代码: 1 #include &l ...
- GaussDB(DWS)磁盘维护:vacuum full执行慢怎么办?
摘要:在数据库中用于维护数据库磁盘空间的工具是VACUUM,其重要的作用是删除那些已经标示为删除的数据并释放空间. vacuum的功能 回收空间 数据库总是不断地在执行删除,更新等操作.良好的空间管理 ...
- Maven基础知识详解
1. 简介 Maven在Java领域的应用已经非常广泛了,有了Maven的存在是的开发人员在搭建.依赖.扩展和打包项目上变得非常简单. 2. Windows安装Maven 下载安装包 http ...
- flink1.11报错No ExecutorFactory found to execute the application
使用flink1.11版本时,报错:No ExecutorFactory found to execute the application 查找maven下载的依赖,发现没有下载flink-clien ...
- Hive数据倾斜优化
在做Shuffle阶段的优化过程中,遇到了数据倾斜的问题,造成了对一些情况下优化效果不明显.主要是因为在Job完成后的所得到的Counters是整个Job的总和,优化是基于这些Counters得出的平 ...