【面试】Spring事务面试考点吐血整理(建议珍藏)

【面试】Spring事务面试考点吐血整理(建议珍藏)

1. Spring事务管理的常见方式

在spring中,常见的事务管理方式有以下几种:

  • 编程式事务管理。
  • 声明式事务管理
  • 注解式事务管理

其中,声明式事务管理更为常用。下面详细讲解声明式事务管理。

2. 声明式事务管理

声明式事务管理采用AOP思想,通过解析事务注解为指定的方法增加事务相关的代码,从而实现事务管理的功能。

在spring中,实现声明式事务管理有两种方式:

2.1 XML方式

通过XML配置文件的方式实现声明式事务管理。需要使用<tx:advice><aop:config>节点进行配置。示例代码如下:

<!-- 数据源相关配置 -->
<bean id="dataSource" class="...
<!-- 配置事务管理器 -->
<bean id="txManager" class="...
<!-- 配置事务通知 -->
<tx:advice id="txAdvice" transaction-manager="txManager">
  <tx:attributes>
    <tx:method name="save*" propagation="REQUIRED" />
    <tx:method name="delete*" propagation="REQUIRED" />
    <tx:method name="update*" propagation="REQUIRED" />
    <tx:method name="get*" read-only="true" />
    ...
  </tx:attributes>
</tx:advice>
<!-- 配置AOP -->
<aop:config>
  <aop:pointcut id="txPointcut" expression="execution(* com.xxxx.*.service.*.*(..))" />
  <aop:advisor advice-ref="txAdvice" pointcut-ref="txPointcut" />
</aop:config>

2.2 注解方式

通过注解的方式实现声明式事务管理。需要在<tx:annotation-driven>节点中配置隐式的事务通知,然后使用@Transactional注解为需要添加事务的方法进行标注。示例代码如下:

<!-- 数据源相关配置 -->
<bean id="dataSource" class="...
<!-- 配置事务管理器 -->
<bean id="txManager" class="...
<!-- 配置事务通知 -->
<tx:annotation-driven transaction-manager="txManager" />
<!-- 在需要添加事务的方法上添加@Transactional注解-->
@Service
public class UserServiceImpl implements UserService {
  @Autowired
  private UserDao userDao;
  @Transactional
  public void save(User user) {
    userDao.save(user);
  }
}

3. 事务的隔离级别

在使用Spring事务管理时,需要考虑事务的隔离级别。Spring事务管理中支持以下五个隔离级别:

  • DEFAULT:采用数据库的默认隔离级别。
  • READ_UNCOMMITTED:脏读,允许读取未提交的数据。
  • READ_COMMITTED:不可重复读,保证一个事务提交之后,另一个事务再读取同样的数据会得到新的结果。
  • REPEATABLE_READ:可重复读,保证一个事务多次读取同样的数据会得到同样的结果。
  • SERIALIZABLE:串行化,保证所有事务依次执行。

示例代码如下:

@Transactional(isolation = Isolation.READ_COMMITTED)
public void transferAmount(String fromAccount, String toAccount, double amount) {
  ...
}

4. 事务的传播行为

在方法中调用其他方法时,可能需要处理嵌套事务的问题。此时需要考虑事务的传播行为。

Spring事务管理支持以下七种传播行为:

  • REQUIRED:如果当前没有事务,则新建一个事务;否则加入当前事务。
  • SUPPORTS:支持当前事务,如果当前没有事务,就以非事务的方式执行。
  • MANDATORY:使用当前事务,如果当前没有事务,则抛出异常。
  • REQUIRES_NEW:新建事务,如果当前有事务,则把当前事务挂起。
  • NOT_SUPPORTED:以非事务方式执行操作,如果当前有事务,则挂起该事务。
  • NEVER:以非事务方式执行,如果当前有事务,则抛出异常。
  • NESTED:如果当前有事务,则在嵌套事务内执行;如果没有,则新建事务。

示例代码如下:

@Transactional(propagation = Propagation.REQUIRED)
public void addOrder(Order order) {
  ...
}

@Transactional(propagation = Propagation.REQUIRES_NEW)
public void updateOrder(Order order) {
  ...
}

以上就是Spring事务面试考点吐血整理的完整攻略,希望能对您有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:【面试】Spring事务面试考点吐血整理(建议珍藏) - Python技术站

(0)
上一篇 2023年5月22日
下一篇 2023年5月22日

相关文章

  • 在centos7中分布式部署pyspider

    下面是如何在CentOS 7中分布式部署Pyspider的完整攻略,分为以下几个步骤: 第一步:安装基础依赖包和Python环境 在CentOS 7系统中,执行以下命令进行基础依赖包和Python环境的安装: yum -y install epel-release yum -y install python-devel python-pip openssl-…

    database 2023年5月22日
    00
  • Tomcat整体结构简单介绍

    Tomcat是一个开源的servlet/JSP容器,是广泛使用的Java Web应用服务器之一。下面我来整理一下Tomcat的整体结构简单介绍攻略。 目录结构 Tomcat的安装目录结构如下: * bin // 存放Tomcat的执行脚本和命令 * conf // 配置文件目录 * lib // 存放Tomcat需要的基础类库和JAR包 * logs // …

    database 2023年5月22日
    00
  • centos安装redis,设置后台进程运行redis或者开机启动

    一、安装redis 第一步:下载redis安装包 http://download.redis.io/releases/redis-4.0.6.tar.gz   第二步:解压压缩包 tar -zxvf redis-4.0.6.tar.gz [root@iZwz991stxdwj560bfmadtZ local]# tar -zxvf redis-4.0.6.t…

    Redis 2023年4月11日
    00
  • Apache同时支持PHP和Python的配置方法

    为使Apache服务器同时支持PHP和Python脚本语言,需要按照以下步骤进行配置。 步骤1:安装Apache服务器 首先,需要安装Apache HTTP服务器。使用如下命令(基于Ubuntu系统): sudo apt-get update sudo apt-get install apache2 安装完成后,可以使用如下命令检查Apache是否已经成功安…

    database 2023年5月22日
    00
  • scrapy爬虫-scrapy-redis分布式

    1、如何将一个scrapy爬虫项目修改成为一个简单的分布式爬虫项目 官方文档:https://scrapy-redis.readthedocs.io/en/stable/ 只用修改scrapy项目的两个文件就可以了 一个是爬虫组件文件# -*- coding: utf-8 -*- scrapy from scrapy_redis.spiders import…

    Redis 2023年4月13日
    00
  • 深入浅出的学习Mysql

    深入浅出的学习MySQL攻略 如果您想深入学习MySQL数据库,以下是一些步骤和示例,可以让您从初学者到初级用户,再到专家。 步骤1: 安装MySQL 首先,您需要在您的计算机上安装MySQL。您可以官方网站找到适合您系统的版本。安装后,请务必设置root账户密码,然后启动MySQL服务。 步骤2: 学习SQL基础知识 学习SQL是学习MySQL的基础。您需…

    database 2023年5月19日
    00
  • 解决linux下redis数据库overcommit_memory问题

    让我来详细讲解解决linux下redis数据库overcommit_memory问题的完整攻略。 什么是overcommit_memory问题 在Linux系统下,overcommit_memory参数决定了操作系统在申请内存时是否进行系统调用,返回来确定操作系统是否可以保证可以提供申请的内存。而redis数据库在申请内存时,操作系统的处理和反馈消息使得re…

    database 2023年5月22日
    00
  • PHP实现的简单分页类及用法示例

    下面我就给出详细的“PHP实现的简单分页类及用法示例”的完整攻略。 准备工作 在使用分页类之前,我们需要先确定每一页显示的记录数、总记录数和当前页码。同时,我们还需要确保PHP已经安装并成功配置。 实现分页类 下面是一段PHP实现的简单分页类的代码: class Page { private $total; // 总记录数 private $pagesize…

    database 2023年5月21日
    00
合作推广
合作推广
分享本页
返回顶部