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

yizhihongxing

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

相关文章

  • 如何用Navicat操作MySQL

    下面我来详细讲解如何用Navicat操作MySQL的完整攻略。 准备工作 如果你想使用Navicat操作MySQL,首先你需要下载并安装Navicat软件,安装完成后,打开Navicat软件。接下来,我们需要连接MySQL数据库。 连接MySQL数据库 打开Navicat软件后,点击左上角的“连接”按钮,在下拉菜单中选择“MySQL”。 在弹出的连接设置对话…

    database 2023年5月22日
    00
  • 基于SQL中的数据查询语句汇总

    下面是“基于SQL中的数据查询语句汇总”的完整攻略。 基于SQL中的数据查询语句汇总 什么是数据查询语句? 数据查询语句是一种用来从数据库中检索数据的命令或语句。通过在SQL(Structured Query Language)中编写查询语句,可以轻松地访问、筛选和排序数据库中的数据。 数据库的基本操作 在进行数据查询之前,需要了解数据库的基本操作。以下是一…

    database 2023年5月22日
    00
  • 如何在Python中使用SQLAlchemy操作PostgreSQL数据库?

    在Python中,我们可以使用SQLAlchemy库操作PostgreSQL数据库。SQLAlchemy是一个Python SQL工具包和ORM,它提供了一种抽象层,使得我们可以使用Python语言来操作各种关系型数据库。以下是如何在Python中使用SQLAlchemy操作PostgreSQL数据库的完整使用攻略,包括连接数据库、创建表、插入数据、查询数据…

    python 2023年5月12日
    00
  • ThinkPHP多表联合查询的常用方法

    Sure! 首先我们需要了解一下ThinkPHP中多表联合查询的相关知识。 概述 在ThinkPHP框架中,多个数据表之间常常需要进行联合查询,以满足数据查询的需求。在数据表之间进行关联的方式有多种,包括一对一、一对多、多对多等。在常用的数据库操作语言中,可以使用JOIN语句进行多表联合查询。在ThinkPHP中,我们也可以使用一些封装好的查询方法来完成多表…

    database 2023年5月22日
    00
  • 一篇文章教会你使用gs_restore导入数据

    一篇文章教会你使用gs_restore导入数据 什么是gs_restore gs_restore是Greenplum中用于还原(greenplum数据库备份还原)数据库的命令行工具。 它可以将通过Greenplum数据库备份工具(gpcrondump,gpdump)备份的数据恢复到Greenplum数据库中。 gs_restore的基本用法 gs_resto…

    database 2023年5月21日
    00
  • MySQL 中的锁有哪些类型,MySQL 中加锁的原则

    MySQL 中的锁理解 锁的类型 全局锁 缺点 适用范围 表级锁 表锁 元数据锁 意向锁 自增锁 行锁 Record Lock Gap Lock Next-Key Lock 插入意向锁 加锁的原则 1、主键等值查询 2、非唯一索引等值查询 3、主键索引范围锁 4、非唯一索引范围查询 5、非唯一索引等值查询 6、limit 语句加锁 总结 参考 MySQL 中…

    MySQL 2023年4月11日
    00
  • MySQL如何查看正在运行的SQL详解

    MySQL 提供了多种方式来查看正在运行的 SQL 语句。下面是一些方法: 方法一:show processlist 使用 show processlist 命令,可以查看当前所有正在运行的 SQL 语句以及执行者等相关信息。 SHOW PROCESSLIST; 该命令将返回一个列表,其中包含当前连接的所有进程及其状态。其中一些字段包括 ID、USER、HO…

    database 2023年5月22日
    00
  • java 执行redis的部分方法

    @Autowired private RedisTemplate<String, Object> redisTemplate; public void setRedisTemplate(RedisTemplate<String, Object> redisTemplate) { this.redisTemplate = redisTe…

    Redis 2023年4月12日
    00
合作推广
合作推广
分享本页
返回顶部