一、Spring事务的实现方式和实现原理(必会)

Spring事务的本质其实就是数据库对事务的支持,没有数据库的事务支持,spring是无法提供事务功能的。真正的数据库层的事务提交和回滚是通过binlog(日志)或者redo log(重做日志)实现的。

spring事务实现主要有两种方法
1、编程式,beginTransaction()手动开启事务、commit()提交、rollback()回滚等事务管理相关的方法
2、声明式,利用注解@Transactional 或者aop配置

二、你知道的Spring的通知类型有哪些,分别在什么时候执行?(了解)

Spring的通知类型有四种,分别为:
前置通知[]before]:在切点运行之前执行
后置通知[after-returning]:在切点正常结束之后执行
异常通知[after-throwing]:在切点发生异常的时候执行
最终通知[after]:在切点的最终执行
Spring还有一种特殊的通知,叫做环绕通知
环绕通知运行程序员以编码的方式自己定义通知的位置, 用于解决其他通知时序问题
一共五种,环绕通知可以囊括前面四种通知

三、Spring的事务传播行为(高薪常问)

spring事务的传播行为说的是,当多个事务同时存在的时候,spring如何处理这些事务的行为。
备注(方便记忆): propagation传播
require必须的/suppor支持/mandatory 强制托管/requires-new 需要新建/ not -supported不支持/never从不/nested嵌套的
① PROPAGATION_REQUIRED:如果当前没有事务,就创建一个新事务,如果当前存在事务,就加入该事务,该设置是最常用的设置。
② PROPAGATION_SUPPORTS:支持当前事务,如果当前存在事务,就加入该事务,如果当前不存在事务,就以非事务执行。
③ PROPAGATION_MANDATORY:支持当前事务,如果当前存在事务,就加入该事务,如果当前不存在事务,就抛出异常。
④ PROPAGATION_REQUIRES_NEW:创建新事务,无论当前存不存在事务,都创建新事务。
⑤ PROPAGATION_NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
⑥ PROPAGATION_NEVER:以非事务方式执行,如果当前存在事务,则抛出异常。
⑦ PROPAGATION_NESTED:如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则按REQUIRED属性执行。

四、Spring中的隔离级别 (高薪常问)

ISOLATION 隔离的意思 :
① ISOLATION_DEFAULT:这是个 PlatfromTransactionManager(平台事务管理器) 默认的隔离级别,使用数据库默认的事务隔离级别(可重复读)。
② ISOLATION_READ_UNCOMMITTED:读未提交,允许另外一个事务可以看到这个事务未提交的数据。
③ ISOLATION_READ_COMMITTED:读已提交,保证一个事务修改的数据提交后才能被另一事务读取,而且能看到该事务对已有记录的更新。解决脏读问题
④ ISOLATION_REPEATABLE_READ:可重复读,保证一个事务修改的数据提交后才能被另一事务读取,但是不能看到该事务对已有记录的更新。行锁
⑤ ISOLATION_SERIALIZABLE:串行读,一个事务在执行的过程中完全看不到其他事务对数据库所做的更新。表锁

1 ) 读未提交 可以看到别人没提交的数据
2 ) 读已提交 可以看到别人提交后的数据,但是不能看到别人未提交的数据(两次查询结果可以不一致)
3 ) 可重复读 只可以看到别人提交后的数据,不能看到别人未提交的数据(两次查询结果必须一致,直到自己提交了事务) 行锁,就是进行行锁,别人提交后才会查询到和上一次查询结果不一致的情况
4 ) 串行读 修改数据时,直接将表锁死,别人只能等待当前事务提交后才可以访问