什么是事务?事物的四大特性?

事务是指单个逻辑工作单元执行的一系列操作(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) --事务,隔离级别,设计模式的更多相关文章

  1. Spring随笔 - 事务隔离级别

    Spring提供5中事务隔离级别: ISOLATION_DEFAULT:使用数据库后端的默认隔离级别. ISOLATION_READ_UNCOMMITTED:允许读取尚未提交的数据变更.可能会导致脏读 ...

  2. 浅谈Spring的事务隔离级别与传播性

    浅谈Spring的事务隔离级别与传播性 这篇文章以一个问题开始,如果你知道答案的话就可以跳过不看啦@(o・ェ・)@ Q:在一个批量任务执行的过程中,调用多个子任务时,如果有一些子任务发生异常,只是回滚 ...

  3. MySQL事务隔离级别测试实例

    https://www.cnblogs.com/huanongying/p/7021555.html MySQL事务隔离级别 事务隔离级别 脏读 不可重复读 幻读 读未提交(read-uncommit ...

  4. spring事务隔离级别、传播机制以及简单配置

    转自 https://blog.csdn.net/zht741322694/article/details/78676964 一.spring支持的事务声明方式1.  编程式事务  当系统需要明确的, ...

  5. Spring事务隔离级别和传播特性

    相信每个人都被问过无数次Spring声明式事务的隔离级别和传播机制吧!今天我也来说说这两个东西. 加入一个小插曲, 一天电话里有人问我声明式事务隔离级别有哪几种, 我就回答了7种, 他问我Spring ...

  6. 浅谈Spring事务隔离级别

    一.Propagation (事务的传播属性) Propagation : key属性确定代理应该给哪个方法增加事务行为.这样的属性最重要的部份是传播行为.有以下选项可供使用:PROPAGATION_ ...

  7. Spring事务配置的五种方式和spring里面事务的传播属性和事务隔离级别

    转: http://blog.csdn.net/it_man/article/details/5074371 Spring事务配置的五种方式 前段时间对Spring的事务配置做了比较深入的研究,在此之 ...

  8. 事务隔离级别与传播机制,spring+mybatis+atomikos实现分布式事务管理

    1.事务的定义:事务是指多个操作单元组成的合集,多个单元操作是整体不可分割的,要么都操作不成功,要么都成功.其必须遵循四个原则(ACID). 原子性(Atomicity):即事务是不可分割的最小工作单 ...

  9. Spring事务隔离级别与传播机制详解,spring+mybatis+atomikos实现分布式事务管理

    原创说明:本文为本人原创作品,绝非他处转载,转账请注明出处 1.事务的定义:事务是指多个操作单元组成的合集,多个单元操作是整体不可分割的,要么都操作不成功,要么都成功.其必须遵循四个原则(ACID). ...

随机推荐

  1. ADB常用的命令

    ADB常用的命令: 1)adb devices---获取设备列表及设备状态 2)adb get-state---获取设备的状态 设备的状态有 3 钟,device.offline.unknown. d ...

  2. 精品工具【音乐下载器(可下载VIP音乐)】

    工具信息 更新时间:2020年5月26日00点07分更新内容:1. 增加快捷键2. 细分下载列表清除功能一款可以下载付费音乐的音乐下载器 下载链接:https://nitian1207.lanzous ...

  3. 题解-FJOI2014 树的重心

    FJOI2014 树的重心 \(Q\) 组测试数据.给一棵树大小为 \(n\),求有多少个子树与其重心相同.重心可能有多个. 数据范围:\(1\le Q\le 50\),\(1\le n\le 200 ...

  4. Centos7网卡绑定的方法

    温和的方式请参考:https://www.cnblogs.com/zzf0305/p/9594093.html 一:传统的bond方式(饭已验证)------------本种的绑定方式比较暴躁 (1) ...

  5. Python零散知识点记录

    1.关于setdefaultencoding之前必须reload(sys): 要在调用setdefaultencoding时必须要先reload一次sys模块,因为这里的import语句其实并不是sy ...

  6. 【Pyhton 】 装饰器

    # -*- coding:utf8 -*-# Author : Mr·Yang''' 装饰器,带参数装饰器,装饰器中带参数''' import time# 普通装饰器'''def time_decor ...

  7. 11g RAC 集群数据库不能跟随集群启动

    1.查看集群资源详细情况 [oracle@rac01-+ASM1 ~]$ crsctl stat res -p 2.修改集群资源ora.rac.db的auto_start属性改为always [ora ...

  8. Intellij idea 创建java web

    https://blog.csdn.net/qq_41592771/article/details/80577791 将tomcat服务器lib目录下面的servlet-api.jar复制到lib文件 ...

  9. Cisco Packet Tracer NAT模拟实验

    Cisco Packet Tracer NAT模拟实验 by: 铁乐猫 date: 2020-09-22 cisco packet tracer : 7.2.2 NAT简介 NAT允许将私有IP地址映 ...

  10. 手写开源ORM框架介绍

    手写开源ORM框架介绍 简介 前段时间利用空闲时间,参照mybatis的基本思路手写了一个ORM框架.一直没有时间去补充相应的文档,现在正好抽时间去整理下.通过思路历程和代码注释,一方面重温下知识,另 ...