zoukankan      html  css  js  c++  java
  • 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

    希望本文章对您有帮助,您的转发、点赞是我的创作动力,十分感谢。更多好文推荐,请关注我的微信公众号--JustJavaIt
  • 相关阅读:
    POJ 2996 Help Me with the Game (模拟)
    PCL系列——怎样逐渐地配准一对点云
    sublime text3同时编辑多行
    博客搬家
    将博客搬至CSDN
    centos7用xshell可以连接, xftp连接失败!(墙裂推荐)
    重启ssh服务出现Redirecting to /bin/systemctl restart sshd.service
    重装wordpress
    ubuntu 16.04 启用root用户方法
    Ubuntu创建新用户并增加管理员权限(授权有问题)
  • 原文地址:https://www.cnblogs.com/liaowenhui/p/12750214.html
Copyright © 2011-2022 走看看