Spring七种事务传播⾏为与五种事务隔离级别
⼀、事务的传播⾏为:通过Propagation定义:
<!-- 配置事务通知 -->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<!-- 以⽅法为单位,指定⽅法应⽤什么事务属性:
isolation:隔离级别 propagation:传播⾏为 read-only:是否只读-->
<tx:method name="transfer" isolation="DEFAULT" propagation="REQUIRED" read-only="false"/>
<!--上⾯的⽅式只适⽤单个⽅法,当我们业务有很多个⽅法都要操作事务时,则要配置很多个,可以使⽤下⾯的通配符配置⽅式-->
<tx:method name="save*" isolation="REPEATABLE_READ" propagation="REQUIRED" read-only="false"/>
省略update..
</tx:attributes>
</tx:advice>
readOnly:
事务属性中的readOnly标志表⽰对应的事务应该被最优化为只读事务。这是⼀个最优化提⽰。
在⼀些情况下,⼀些事务策略能够起到显著的最优化效果,例如在使⽤Object/Relational映射⼯具(如:或TopLink)时避免dirty checking(试图“刷新”)。
spring中的事务隔离级别?
spring的事务隔离级别其实本质上是对SQL标准的4种事务隔离级别的⼀种封装。
什么是脏数据,脏读,不可重复读,幻觉读?
脏读::指当⼀个事务正在访问数据,并且对数据进⾏了修改,⽽这种修改还没有提交到数据库中,这时,
另外⼀个事务也访问这个数据,然后使⽤了这个数据。那么另外⼀个事务读到的这个数据是脏数据。
不可重复读:指在⼀个事务内,多次读同⼀数据。在这个事务还没有结束时,另外⼀个事务也更新了该同⼀数据。
那么,在第⼀个事务中的两次读数据之间,由于第⼆个事务的修改,那么第⼀个事务两次读到的数据
可能是不⼀样的。这样就发⽣了在⼀个事务内两次读到的数据是不⼀样的,因此称为是不可重复读。
幻读:当第⼀个事务对⼀个表中的数据进⾏了修改,这种修改涉及到表中的全部数据⾏。同时,第⼆个事务是向表中插⼊⼀⾏新数据。那么,以后就会发⽣操作第⼀个事务的⽤户发现表中还有没有修改的数据⾏,就好象发⽣了幻觉⼀样。
Spring事务的实现⽅式和实现原理?
1、⽅式:Spring事务的本质其实就是数据库对事务的⽀持,没有数据库的事务⽀持,spring是⽆法提供事务功能的。
2、原理:真正的数据库层的事务提交和回滚是通过binlog或者redo log实现的。
Spring事务的配置⽅式?
spring⽀持编程式事务管理和声明式事务管理两种⽅式:
第⼀种:编程式事务管理:在xml配置注⼊TransactionTemplate的bean,在service服务代码调⽤TransactionTemplate。
第⼆种:声明式事务管理建⽴在AOP之上的。(在 xml配置aop切⾯,核⼼事务管理器:transactionManager)
其本质是通过AOP功能,对⽅法前后进⾏拦截,将事务处理的功能编织到拦截的⽅法中,也就是在⽬标⽅法开始之前加⼊⼀个事务,在执⾏完⽬标⽅法之后根据执⾏情况提交或者回滚事务。
第三种:注解配置aop。开启注解管理事务。导⼊约束:transactionManager。
@Transactional(isolation = Isolation.REPEATABLE_READ,propagation = Propagation.REQUIRED,readOnly = false)
public void transfer(Integer from,Integer to, Double money) {
以上⽅式举例:
Spring框架的事务管理有哪些优点?
1、不同的事务API(如JTA, JDBC, Hibernate)提供了统⼀的编程模型。
2、为编程式事务管理提供了⼀个简单的API⽽⾮⼀系列复杂的事务API(如JTA).
3、它⽀持声明式事务管理。
4、它可以和Spring 的多种数据访问技术很好的融合。
Spring 事务底层原理?
1、划分处理单元ioc:
由于spring解决的问题是对单个数据库进⾏局部事务处理的,具体的实现⾸先⽤spring中的IoC划分了事务处理单元。并且将对事务的各种配置放到了ioc容器中(设置事务管理器,设置事务的传播特性及隔离机制)。
2、AOP拦截需要进⾏事务处理的类:
Spring事务处理模块是通过AOP功能来实现声明式事务处理的,具体操作(⽐如事务实⾏的配置和读取,事务对象的抽象),⽤TransactionProxyFactoryBean接⼝来使⽤AOP功能,⽣成proxy代理对象,通过TransactionInterceptor完成对代理⽅法的拦截,将事务处理的功能编织到拦截的⽅法中。
3、对事务处理实现:
(事务的⽣成、提交、回滚、挂起)spring委托给具体的事务处理器实现。实现了⼀个抽象和适配。适配的具体事务处理器:DataSource数据源⽀持、hibernate数据源事务处理⽀持。这些⽀持都是通过设计PlatformTransactionManager、AbstractPlatforTransaction⼀系列事务处理的⽀持。为常⽤数据源⽀持提供了⼀系列的TransactionManager。
4、整合:
PlatformTransactionManager实现了TransactionInterception接⼝,让其与TransactionProxyFactoryBean结合起来,形成⼀个Spring声明式事务处理的设计体系。spring ioc注解
什么是Spring Beans?
1、Spring Beans是构成Spring应⽤核⼼的Java对象。这些对象由Spring IOC容器实例化、组装、管理。这些对象通过容器中配置的元数据创建,例如,使⽤XML⽂件中定义的创建。
2、在Spring中创建的beans都是单例的beans。在bean标签中有⼀个属性为”singleton”,如果设为true,该bean是单例的,如果设为false,该bean是原型bean。Singleton属性默认设置为true。因此,spring框架中所有的bean都默认为单例bean。
Spring 的单例实现原理?
Spring框架对单例的⽀持是采⽤单例注册表的⽅式进⾏实现的,⽽这个注册表的缓存是HashMap对象。
如果配置⽂件中的配置信息不要求使⽤单例,Spring会采⽤新建实例的⽅式返回对象实例。
解释Spring框架中bean的⽣命周期?
1.⾸先容器启动后,会对scope为singleton且⾮懒加载的bean进⾏实例化,
2.按照Bean定义信息配置信息,注⼊所有的属性,
3.如果Bean实现了BeanNameAware接⼝,会回调该接⼝的setBeanName()⽅法,传⼊该Bean的id,此时该Bean就获得了⾃⼰在配置⽂件中的id,
4.如果Bean实现了BeanFactoryAware接⼝,会回调该接⼝的setBeanFactory()⽅法,传⼊该Bean的BeanFactory,这样该Bean就获得了⾃⼰所在的BeanFactory,
5.如果Bean实现了ApplicationContextAware接⼝,会回调该接⼝的setApplicationContext()⽅法,传⼊该Bean的ApplicationContext,这样该Bean就获得了⾃⼰所在的ApplicationContext,
6.如果有Bean实现了BeanPostProcessor接⼝,则会回调该接⼝的postProcessBeforeInitialzation()⽅法,
7.如果Bean实现了InitializingBean接⼝,则会回调该接⼝的afterPropertiesSet()⽅法,
8.如果Bean配置了init-method⽅法,则会执⾏init-method配置的⽅法,
9.如果有Bean实现了BeanPostProcessor接⼝,则会回调该接⼝的postProcessAfterInitialization()⽅法,
10.经过流程9之后,就可以正式使⽤该Bean了,对于scope为singleton的Bean,Spring的ioc容器中会缓存⼀份该bean的实例,⽽对于scope为prototype的Bean,每次被调⽤都会new⼀个新的对象,期⽣命周期就交给调⽤⽅管理了,不再是Spring容器进⾏管理了
11.容器关闭后,如果Bean实现了DisposableBean接⼝,则会回调该接⼝的destroy()⽅法,
12.如果Bean配置了destroy-method⽅法,则会执⾏destroy-method配置的⽅法,⾄此,整个Bean的⽣命周期结束
Resource 是如何被查、加载的?
Resource 接⼝是 Spring 资源访问策略的抽象,它本⾝并不提供任何资源访问实现,具体的资源访问由该接⼝的实现类完成——每个实现类代表⼀种资源访问策略。Spring 为 Resource 接⼝提供了如下实现类:
1、UrlResource:访问⽹络资源的实现类。
2、ClassPathResource:访问类加载路径⾥资源的实现类。
3、FileSystemResource:访问⽂件系统⾥资源的实现类。
4、ServletContextResource:访问相对于 ServletContext 路径⾥的资源的实现类。
5、InputStreamResource:访问输⼊流资源的实现类。
6、ByteArrayResource:访问字节数组资源的实现类。
这些 Resource 实现类,针对不同的的底层资源,提供了相应的资源访问逻辑,并提供便捷的包装,以利于客户端程序的资源访问。
解释⾃动装配的各种模式?
⾃动装配提供五种不同的模式供Spring容器⽤来⾃动装配beans之间的依赖注⼊:
no:默认的⽅式是不进⾏⾃动装配,通过⼿⼯设置ref 属性来进⾏装配bean。
byName:通过参数名⾃动装配,Spring容器查beans的属性,这些beans在XML配置⽂件中被设置为byName。之后容器试图匹配、装配和该bean 的属性具有相同名字的bean。
byType:通过参数的数据类型⾃动⾃动装配,Spring容器查beans的属性,这些beans在XML配置⽂件中被设置为byType。之后容器试图匹配和装配和该bean的属性类型⼀样的bean。如果有多个bean符合条件,则抛出错误。
constructor:这个同byType类似,不过是应⽤于构造函数的参数。如果在BeanFactory中不是恰好有⼀个bean与构造函数参数相同类型,则抛出⼀个严重的错误。
autodetect:如果有默认的构造⽅法,通过 construct的⽅式⾃动装配,否则使⽤ byType的⽅式⾃动装配。
有那些哪种依赖注⼊?选择构造器依赖注⼊还是Setter⽅法依赖注⼊?
构造器注⼊,set注⼊,接⼝注⼊。
你可以同时使⽤两种⽅式的依赖注⼊,最好的选择是使⽤构造器参数实现强制依赖注⼊,使⽤setter⽅法实现可选的依赖关系。
Spring IOC 如何实现?
Spring中的 org.springframework.beans 包和 t包构成了Spring框架IoC容器的基础。
BeanFactory 接⼝提供了⼀个先进的配置机制,使得任何类型的对象的配置成为可能。ApplicationContex接⼝对BeanFactory(是⼀个⼦接⼝)进⾏了扩展,在BeanFactory的基础上添加了其他功能,⽐如与Spring的AOP更容易集成,也提供了处理message resource的机制(⽤于国际化)、事件传播以及应⽤层的特别配置,⽐如针对Web应⽤的WebApplicationContext。
org.springframework.beans.factory.BeanFactory 是Spring IoC容器的具体实现,⽤来包装管理各种bean。BeanFactory接⼝是Spring IoC 容器的核⼼接⼝。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论