b2科目四模拟试题多少题驾考考爆了怎么补救
b2科目四模拟试题多少题 驾考考爆了怎么补救

【Java面试题】Spring事务面试考点整理-知了堂

电脑杂谈  发布时间:2019-05-29 09:18:28  来源:网络整理

spring aop 事务_spring 事务 rollback-for_spring 事务面试题

声明式事务成为可能,主要得益于Spring AOP。使用一个事务,在方法调用的前后/周围进行事务性增强(advice),来驱动事务完成spring 事务面试题

如何回滚一个事务

支持当前事务,如果当前没有事务,就抛出异常。propagation_mandatory--支持当前事务,如果当前没有事务,就抛出异常。mandatory:支持当前事务,如果当前没有事务,就抛出异常。

默认回滚规则

默认只把runtime, unchecked exceptions标记为回滚,即RuntimeException及其子类,Error默认也导致回滚。Checked exceptions默认不导致回滚。这些规则和EJB是一样的。

如何配置回滚异常

还有更灵活的回滚规则配置方法,同时指定什么异常回滚,什么异常不回滚。传统的mybatis配置sql语句方式就是使用xml文件进行配置的,但是这种方式不能很好地支持面向接口编程的理念,为了支持面向接口的编程,mybatis引入了mapper接口的概念,面向接口的引入,对使用注解来配置sql语句成为可能,用户只需要在接口上添加必要的注解即可,不用再去配置xml文件了,但是,目前的mybatis只是对注解配置sql语句提供了有限的支持,某些高级功能还是要依赖xml配置文件配置sql语句。这里要额外注意一点的是,在上面代码中我还声明了remove这个移除节点,这是为了防止重复添加mime类型导致网站出现这个异常信息:“在唯一密钥属性“fileextension”设置为“.woff”时,无法添加类型为“mimemap”的重复集合项”,如果你的网站没有提示这个异常信息,或者能确定用户的iis上一定没有配置这几个扩展名,那么remove节点就可以不用加。

(3)设置连接的事务信息(是否自动提交、事务级别),从配置环境中获取事务工厂,事务工厂获取一个新的事务。不可重复读:事务 a 多次读取同一数据,事务 b 在事务a多次读取的过程中,对数据作了更新并提交,导致事务a多次读取同一数据时,结果 不一致。声明式事务使用spring声明式事务,spring使用aop来支持声明式事务,会根据事务属性,自动在方法调用之前决定是否开启一个事务,并在方法执行之后决定事务提交或回滚事务。

事务注解在类/方法上

@Transactional注解既可以标注在类上,也可以标注在方法上。当在类上时,默认应用到类里的所有方法。如果此时方法上也标注了,则方法上的优先级高。

事务注解在类上的继承性

@Transactional注解的作用可以传播到子类,即如果父类标了子类就不用标了。但倒过来就不行了。

子类标了,并不会传到父类,所以父类方法不会有事务。父类方法需要在子类中重新声明而参与到子类上的注解,这样才会有事务。

spring aop 事务_spring 事务面试题_spring 事务 rollback-for

事务注解在接口/类上

@Transactional注解可以用在接口上,也可以在类上。在接口上时,必须使用基于接口的代理才行,即JDK动态代理。

事实是Java的注解不能从接口继承,如果你使用基于类的代理,即CGLIB,或基于织入方面,即AspectJ,事务设置不会被代理和织入基础设施认出来,目标对象不会被包装到一个事务代理中。

Spring团队建议注解标注在类上而非接口上。

只在public方法上生效?

当采用代理来实现事务时,(注意是代理),@Transactional注解只能应用在public方法上。当标记在protected、private、package-visible方法上时,不会产生错误,但也不会表现出为它指定的事务配置。可以认为它作为一个普通的方法参与到一个public方法的事务中。

如果想在非public方法上生效,考虑使用AspectJ(织入方式)。

目标类里的自我调用没有事务?

在代理模式中(这是默认的),只有从外部的方法调用进入通过代理会被拦截,这意味着自我调用(实际就是,目标对象中的一个方法调用目标对象的另一个方法)在运行时不会导致一个实际的事务,即使被调用的方法标有注解。

这样的实现带来的影响是: 在目标对象中调用自己类内部实现的方法时,spring会为该方法所在的bean动态的生成一个代理类,当这个方法被调用时,实际上是代理类调用的,如果该方法有transactional注解,代理类在调用之前就会启动transactional,如果没有,代理类就不启动事务。【以上的事务和事务自动代理方式实现原理:像struts2一样,都是凭借强大的功能对业务逻辑方法的调用进行拦截,然后又beannameautoproxycreator自动生成事务代理,最后送事务管理器,统一管理】。 当执行事务的类没有实现接口时,可能会报错: cannot proxy target class because cglib2 is not available. add cglib to the class path or specify proxy interfaces 这时,我们加入 cglib-2.2.jar 这个包就可以了,当然,也要加入其依赖的包:asm-3.2.jar 因为 jdk 的动态代理主要是面向接口的,当事务类没有实现任何接口时,就会报出上面的错误,而cglib主要是针对类的代理。

事务与线程

启动一个线程是调用start()方法,使线程就绪状态,以后可以被调度为运行状态,一个线程必须关联一些具体的执行代码,run()方法是该线程所关联的执行代码。声明式事务使用spring声明式事务,spring使用aop来支持声明式事务,会根据事务属性,自动在方法调用之前决定是否开启一个事务,并在方法执行之后决定事务提交或回滚事务。比 如各种context,context代表的是执行某个任务需要的环境信息,这里我们可以定义httpcontext、 controllercontext、actioncontext和viewcontext,后者继承前者,随着mvc处理流程的进行,view执行时的 上下文相比action执行时的上下文信息肯定是多了视图的信息,其它同理,之所以把这个信息放在common里面而不是放在各个模块自己的包内是因为这 样更清晰,可以一目了然各种对象的执行上下文有一个立体的概念。

逻辑事务与物理事务

spring 事务面试题_spring 事务 rollback-for_spring aop 事务

实际上可以依靠运维的手段来简化开发的侵入,我们的方法是让 dba 在公司所有 mysql 实例上预初始化这个库,通过框架层(消息的客户端或事务 rpc 框架)透明的在背后操作这个库,业务开发人员只需要关心自己的业务逻辑,不需要直接访问这个库。事务是作为一个逻辑单元执行的一系列操作,一个逻辑工作单元必须有四个属性,称为 acid(原子性、一致性、隔离性和持久性)属性,只有这样才能成为一个事务:原子性,事务必须是原子工作单元。原理: 1.读取并解析配置文件 2.读取并解析映射信息,创建sessionfactory 3.打开session 4.创建事务transation 5.持久化操作 6.提交事务 7.关闭session 8.关闭sesstionfactory。

在逻辑事务中,大范围的事务称为事务,小范围的事务称为内部事务,事务可以包含内部事务,但在逻辑上是互相独立的。每一个这样的逻辑事务范围,都能够单独地决定rollback-only状态。

那么如何处理逻辑事务和物理事务之间的关联关系呢,这就是传播特性解决的问题。

事务的传播特性

REQUIRED,SUPPORTS,MANDATORY,REQUIRES_NEW,NOT_SUPPORTED,NEVER,NESTED

REQUIRED

平等原则的基本要求就是相同事务相同处理,不同事务不同处理。基于上面的代码,可以看出,如果多个线程使用这种方式来进入一个criticalsection的话,当某个线程处于criticalsection内,那其它的线程将会处于"循环等待"的状态,虽然有sleep(0),但是这是死循环,在这里等待互斥资源的释放,对cpu的占用率是相当的高. 所以使用criticalsection只适合在criticalsection区域内处理的事情是非常简单的,耗时非常短的(程序级别的时间),如果处理事务用的时间比较长的话,就不适合用criticalsection这种方式来解决问题. 还有一种情况,就是说,criticalsection区域不会经常的执行,但即使是这种情况,如果criticalsection区域内的事务执行时间比较长的话,还是不适合使用criticalsection这种方式来解决问题,因为如果出现某一线程在criticalsection区域内,而此时正好有其它的线程也要进入criticalsection区域,那待进入criticalsection区域的线程将处于等待状态,这个等待状态是很消耗cpu的(criticalsection的实现方式决定了它消耗cpu).简单来说,就是互斥区域的代码,如果执行的事务比较多,耗时比较长,就不适合使用criticalsection方式来解决问题(我觉得我有点唐僧了).。spring的事务管理机制是一种典型的策略模式,platformtransactionmanager代表事务管理接口,该接口定义了三个方法,该接口并不知道底层如何管理事务,但是它的实现类必须提供gettransaction()方法(开启事务)、commit()方法(提交事务)、rollback()方法(回滚事务)的多态实现,这样就可以用不同的实现类代表不同的事务管理策略。

在标准的REQUIRED行为情况下,所有这样的逻辑事务范围映射到同一个物理事务。因此,在内部事务范围设置了rollback-only标记,确实会影响事务进行实际提交的机会。

5、com+的事务属性 com+的事务默认级别是序列 read,而不是我们认为的commit read,而且我们设置adoconnection的隔离级是不管用的,只能强制用显式的sql才能起效果。mysql允许使用set transaction isolation level命令设置隔离级,新的隔离级将在下一个事务开始后生效。(3)设置连接的事务信息(是否自动提交、事务级别),从配置环境中获取事务工厂,事务工厂获取一个新的事务。

REQUIRES_NEW

与REQUIRED相比,总是使用一个独立的物理事务用于每一个受影响的逻辑事务范围,从来不参与到一个已存在的事务范围。这样安排的话,底层的事务资源是不同的,因此,可以独立地提交或回滚。事务不会被内部事务的回滚状态影响。这样一个独立的内部事务可以声明自己的隔离级别,超时时间和只读设置,并不继承事务的特性。

NESTED

使用同一个物理事务,带有多个保存点,可以回滚到这些保存点,可以认为是部分回滚,这样一个内部事务范围触发了一个回滚,事务能够继续这个物理事务,尽管有一些操作已经被回滚。典型地,它对应于JDBC的保存点,所以只对JDBC事务资源起作用。

spring aop 事务_spring 事务面试题_spring 事务 rollback-for

SUPPORTS

支持当前事务。如果当前有事务,就参与进来,如果没有,就以非事务的方式运行。这样的一个逻辑事务范围,它背后可能没有实际的物理事务,此时的事务也成为空事务。

NOT_SUPPORTED

不支持当前事务。总是以非事务方式运行。当前的事务会被挂起,并在适合的时候恢复。

MANDATORY

支持当前事务spring 事务面试题。如果当前没有事务存在,就抛出异常。

NEVER

不支持当前事务。如果当前有事务存在,就抛出异常。

事务的隔离级别

DEFAULT,READ_UNCOMMITTED,READ_COMMITTED,REPEATABLE_READ,SERIALIZABLE

脏读

一个事务修改了一行数据但没有提交,第二个事务可以读取到这行被修改的数据,如果第一个事务回滚,第二个事务获取到的数据将是无效的。

不可重复读

spring 事务面试题_spring 事务 rollback-for_spring aop 事务

一个事务读取了一行数据,第二个事务修改了这行数据,第一个事务重新读取这行数据,将获得到不同的值。

幻读

3.幻读(phantom reads):一个事务按相同的查询条件重新读取以前检索过的数据,却发现其他事务插入了满足其查询条件的新数据,这种现象就称为幻读。不可重复读:事务 a 多次读取同一数据,事务 b 在事务a多次读取的过程中,对数据作了更新并提交,导致事务a多次读取同一数据时,结果 不一致。不可重复读(unrepeatable read):事务a重新读取前面读取过的数据,发现该数据已经被另一个已提交的事务b修改过了。

帮助记忆:

写读是脏读,读写读是不可重复读,where insert where是幻读。

DEFAULT

使用底层数据存储的默认隔离级别。MySQL的默认隔离级别是REPEATABLE-READ。

READ_UNCOMMITTED

读未提交。脏读、不可重复读、幻读都会发生。

READ_COMMITTED

读已提交。脏读不会发生,不可重复读、幻读都会发生。

REPEATABLE_READ

可重复读。脏读、不可重复读都不会发生,幻读会发生。

SERIALIZABLE

可串行化。脏读、不可重复读、幻读都不会发生。


本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-102153-1.html

    相关阅读
      发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

      热点图片
      拼命载入中...