Spring事务是面试中经常被问到的话题之一,一个良好的代码逻辑组成和一个完善的事务机制是保证程序高可用、高稳定性、高并发的必要因素之一。本篇文章将全面讲解关于Spring事务面试题的相关内容,主要包含以下几个方面:
一、关于Spring事务面试题
在面试中常常被问到有关Spring事务的问题,这就需要我们能够熟练掌握Spring事务的相关知识。Spring提供了一种与底层事务管理机制解耦的抽象机制,既可以管理JDBC事务,也可以管理JTA事务。
有关Spring事务面试题的常见问题,如下:
- Spring事务的传播行为是什么?
- Spring事务的隔离级别是什么?
- Spring事务管理是如何实现的?
- Spring事务的AOP原理是什么?
- Spring声明式事务和编程式事务的区别是什么?
二、Spring控制事务面试题
在Spring中,核心的控制事务的接口是org.springframework.transaction.PlatformTransactionManager,它负责事务管理,并且可以和任意的数据访问技术进行整合。 当我们编写Spring应用时,大部分可以使用Spring所提供的声明式事务支持,Spring提供了两种方式来声明一个事务,分别是基于XML方式以及基于注解的方式。
下面是一个Controller中对事务进行控制的代码示例:
@Controller
@RequestMapping("/user")
public class UserController {
@Autowired
UserService userService;
@RequestMapping(value = "/add", method = RequestMethod.POST)
@ResponseBody
@Transactional(rollbackFor = Exception.class)
public String add(User user) {
try {
userService.add(user);
return "success";
} catch (Exception e) {
e.printStackTrace();
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
}
return "fail";
}
}
三、Spring事务不生效的场景
在使用Spring事务的过程中,我们可能会遇到事务不生效的场景,主要是因为以下原因:
- 代码中捕获了异常没有继续抛出 —— 事务管理器只会在抛出异常时才会进行事务回滚,如果我们代码中自己将异常catch住了,这时就不会回滚并且也不会报错.
- 同一个类中,使用了注解@Async —— 这是由于Spring AOP的局限性导致的:由于@Async注解会被动态生成一个新的代理类来对方法做增强,这时就跟我们的事务切面所在的代理类不是一个class,因此,事务切面失效了.
- 多线程的情况下,由于线程池的原因,Spring的事务会失效 —— 由于Spring的事务是基于线程来管理的,而线程池会将执行任务的线程复用,因此会发生线程间的上下文泄漏。
四、Spring事务机制面试题
Spring的事务机制是基于AOP(面向切面编程)实现的,它将所有事务操作封装成方法,在切点上拦截方法并添加事务支持。在实现过程中,Spring使用动态代理的方式,在原有代码不做修改的情况下把事务管理逻辑集成进去。
下面是一个事务切面的声明方式的代码:
@Transactional(isolation = Isolation.READ_COMMITTED, propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
@Service
public class UserServiceImpl implements UserService {
@Autowired
UserMapper userMapper;
@Override
public boolean add(User user) {
return userMapper.insert(user) > 0;
}
}
五、Spring事务是什么
Spring的事务机制就是为了解决应用程序操作数据库过程中出现异常等问题的机制,主要提供了声明式事务和编程式事务两种方式。在Spring中默认情况下是采用声明式事务管理方式,通过AOP技术在所有需要进行事务管理的方法上进行增强完成事务处理的功能。
以下是一个基于XML方式声明式事务的代码示例:
六、Spring JPA面试题
Spring Data JPA是Spring Framework基于JPA API标准的Repository接口的实现及增强,使得在Spring应用中使用JPA变得更加方便。Spring Data JPA最大的优势在于能够简化数据访问层的代码极度,同时还提供了更多的查询特性、预定义的repository继承结构,以及对查询DSL(如 Querydsl)的支持,同时还具有更好的可扩展性来满足各种不同的项目需求。
以下是一个Spring Data JPA的代码示例:
@Repository
public interface UserRepository extends JpaRepository
{
}
七、SpringBoot面试题
Spring Boot是Spring框架的一套微观服务框架,它使用自动配置、快速启动和开发常用功能的约定来简化Spring开发。Spring Boot提供了内嵌Tomcat/Jetty/Undertow、JPA、Thymeleaf模板引擎、Spring Session等功能,并且还提供了一些常用功能的Starter,开箱即用。
以下是一个基于Spring Boot的代码示例:
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
八、Spring面试题
Spring是一个轻量级的Java应用程序框架,它可以帮助我们更好、更快、更容易地开发企业级应用程序。在Spring中,通过ioc容器来管理JavaBean,通过AOP技术分离了业务逻辑和系统服务,通过事务机制解决并发问题。
以下是一个基于Spring的代码示例:
@Service
public class UserServiceImpl implements UserService {
@Autowired
UserMapper userMapper;
@Override
public boolean add(User user) {
return userMapper.insert(user) > 0;
}
}
九、Spring事务注解
Spring通过注解来简化开发,包括事务注解也是如此。在Spring中,使用@Transactional来处理事务注解,在Service接口实现层上标注@Transactional注解,即可完成事务管理。如果要指定一些事务管理的属性,可以在注解中设置。
以下是一个基于注解的事务管理的代码示例:
@Transactional(rollbackFor = Exception.class)
@Service
public class UserServiceImpl implements UserService {
@Autowired
UserMapper userMapper;
@Override
public boolean add(User user) {
return userMapper.insert(user) > 0;
}
}
十、Spring面试题及答案整理选取
以下是一些常见的Spring面试题及答案:
- Spring是什么,它有什么优点?
- Spring的核心架构及原理?
- Spring Bean 的生命周期?
- Spring的依赖注入(DI)和控制反转(IoC)是什么?
- Spring AOP的概念及实现原理?
- Spring AOP的应用场景?
- Spring事务管理机制是什么?
- Spring声明式事务和编程式事务的区别是什么?
选取部分常见问题的答案:
- Spring是什么,它有什么优点?
Spring是一个轻量级的Java应用程序框架,它可以帮助我们更好、更快、更容易地开发企业级应用程序。主要优点包括:
- 适用范围广,可用于MVC开发、web服务、企业应用等领域
- 基于非侵入式的编程方式,提高代码重用性和系统的松耦合性
- 容器托管控制反转、依赖注入,减少了使用者的工作量,使得系统实现更易用,部署更方便
- 提供了众多的拓展包和插件,如aop、事务、jdbc、orm等,增强了可扩展性和可定制性
- Spring AOP的应用场景?
Spring的AOP技术提供了一种将系统业务逻辑与系统服务相隔离的方式,从而实现优秀的业务解耦。Spring AOP的应用场景如下:
- 日志数据的收集,如对一个业务进行执行时间记录或者对方法的参数进行收集;
- 性能监控,如对于一个方法执行的时间进行监控或者对一个方法执行的性能指标进行分析;
- 事务控制,如对于一个业务操作或者一组操作实现统一的事务控制;
- 安全管理,如对于某些敏感操作的进行身份验证或者授权。
- Spring事务管理机制是什么?
Spring事务管理机制通过AOP技术对事务进行资源管理,将所有事务操作封装成方法,在切点上拦截方法并添加事务支持。我们可以通过注解或XML方式配置事务管理机制,同时适用于自动提交、容器托管和声明式事务等多种开发模式。主要包含以下几个方面:
- 事务管理器(PlatformTransactionManager): 负责事务管理,并且可以和任意的数据访问技术进行整合。
- 事务定义(TransactionDefinition