【面试】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日

相关文章

  • SQLserver2008使用表达式递归查询

    下面是“SQL server 2008使用表达式递归查询”的完整攻略。 什么是表达式递归查询 表达式递归查询是一种使用递归方式查询数据的方法。它与常规递归的不同之处在于它使用了SQL Server的WITH语句,这使得它更容易理解而且性能更好。在这种类型的查询中,一个查询使用自身的输出来生成下一个查询的输入,这样就可以逐步构造出一个结果集。 使用表达式递归查…

    database 2023年5月21日
    00
  • 解析Linux特殊文件

    接下来我将为您详细讲解“解析Linux特殊文件”的完整攻略。 什么是特殊文件 在Linux中,特殊文件是一种在文件系统中特殊处理的文件,用于与设备和文件系统进行交互。特殊文件通常分为两种类型:字符设备和块设备。 字符设备:字符设备是指以字符为单位进行输入输出的设备,例如键盘、鼠标等外设。 块设备:块设备是指以块为单位进行输入输出的设备,例如硬盘、U盘等储存设…

    database 2023年5月22日
    00
  • MongoDB原子操作的8种方法

    MongoDB原子操作是指一个操作要么全部执行成功,要么全部失败回滚。 MongoDB的原子操作包括: 1. findAndModify:查询并修改一个文档。可以实现对一个文档的原子更新和查询。 示例: db.collection.findAndModify({ query: { name: 'Alice' }, update: { $i…

    MongoDB 2023年3月14日
    00
  • Flink 三种Sink redis,es和jdbc

    一、redis sink 对应jar包 <dependency> <groupId>org.apache.bahir</groupId> <artifactId>flink-connector-redis_2.11</artifactId> <version>1.0</versio…

    Redis 2023年4月13日
    00
  • mysql中的一些稍微复杂用法实例代码

    下面给您讲解一下“mysql中的一些稍微复杂用法实例代码”的完整攻略。 一、连接多个表查询数据 使用JOIN关键字可以连接多个表查询数据。比如我们有两个表:学生表和成绩表,我们需要查询每个学生的总成绩,可以使用以下SQL语句: SELECT s.name, SUM(g.score) AS total_score FROM student s JOIN gra…

    database 2023年5月22日
    00
  • Go实现简单的数据库表转结构体详解

    Go实现简单的数据库表转结构体详解 简介 在Go开发中,我们经常需要与数据库打交道。当我们拿到一张数据库表的时候,如何快速地将其转换为对应的struct呢?这里介绍一个简单的方法,通过使用第三方工具实现表结构的转换。 工具介绍 xo是一个功能强大且易于使用的Go ORM和代码生成工具。它可以通过连接到现有数据库并运行一组命令来生成Go语言代码,其中包括 st…

    database 2023年5月22日
    00
  • Linux安装MariaDB数据库的实例详解

    Linux安装MariaDB数据库的实例详解 MariaDB是一个免费且开源的关系型数据库,是MySQL的一个分支,它完全兼容MySQL,具备更好的性能和更加丰富的功能,因此得到了很多用户的青睐。本文将向您介绍在Linux系统上如何安装MariaDB数据库。 步骤一:安装MariaDB数据库 在Linux系统中,我们可以使用以下命令来安装MariaDB数据库…

    database 2023年5月22日
    00
  • 详解如何在Linux(CentOS)下重置MySQL根(Root)密码

    下面是详解如何在Linux(CentOS)下重置MySQL根(Root)密码的完整攻略: 1. 关闭MySQL服务 在修改MySQL的密码前,需要先关闭MySQL服务。可以使用以下命令来关闭MySQL服务: sudo systemctl stop mysqld 2. 启动MySQL服务,并跳过授权验证 在 MySQL 5.7.6 之后的版本中,为了保证安全性…

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