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

事务是指单个逻辑工作单元执行的一系列操作(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

最新文章

  1. scikit-learn一般实例之一:保序回归(Isotonic Regression)
  2. [Unity3D]NGUI用Sprite动画和屏幕自适应做游戏开始场景
  3. mysql中字符集的比较
  4. wpa_supplicant代码走读
  5. rsync实现负载均衡集群文件同步,搭建线上测试部署环境
  6. 6-01T-SQL中的运算符
  7. 北京联想招聘-java 云服务开发工程师 加入qq 群:220486180 或者直接在此 留言咨询
  8. Object Pascal 语言基础
  9. HDU 5794 A Simple Chess (Lucas + dp)
  10. Kinect for Windows V2和V1对照开发___深度数据获取并用OpenCV2.4.10显示
  11. Opencv读取视频一闪而过情况分析
  12. ASP.NET MVC3中的路由系统 Routes
  13. Python算术运算
  14. Elasticsearch alias别名管理小结
  15. [蓝桥杯]ALGO-181.算法训练_According to Bartjens
  16. B. ZgukistringZ
  17. Codeforces 888G Xor-MST - 分治 - 贪心 - Trie
  18. 从阿里Java开发手册学习线程池的正确创建方法
  19. java-nio之zero copy深入分析
  20. GridView 控制默认分页页码间距 及字体大小

热门文章

  1. ❤空植发队 影评网站FilmReviewWeb-团队介绍
  2. css3实现立体魔方效果
  3. Panda Global 要点聚焦,区块链在数字医疗的落地应
  4. java.lang.UnsupportedOperationException: Unable to create instance of org.fisco.bcos.web3j.abi.datatypes.generated.Int256
  5. linux关闭在线登录用户
  6. DVWA各级文件包含漏洞
  7. python(iJmeter-master)接口测试程序部署实践
  8. .NET Core +Angular 项目 部署到CentOS
  9. Dotnet Core多版本API共存的优雅实现
  10. 程序运行慢?你怕是写的假 Python