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

相关文章

  • redis中使用redis-dump导出、导入、还原数据实例

    下面是使用redis-dump在Redis中导出、导入、还原数据实例的完整攻略。 1. 介绍 Redis-dump是一个开源工具,它可以用于Redis数据库的备份和还原。它将Redis数据库导出为一个格式化的JSON文件,用户可以使用此文件来还原数据库。接下来我们将使用redis-dump工具来实现Redis数据的导出、导入、还原操作。 2. 安装redis…

    database 2023年5月22日
    00
  • sqlserver 中时间为空的处理小结

    下面是详细讲解 SQL Server 中时间为空的处理小结的完整攻略。 标题 SQL Server 中时间为空的处理小结 问题描述 在 SQL Server 中,我们常常需要对时间类型的数据进行操作,但有时候这些数据可能是空值,而空值的处理需要特别注意。本文将为大家讲解在 SQL Server 中处理时间为空值的方法。 空值判断方法 在 SQL Server…

    database 2023年5月21日
    00
  • mysql多表联合查询返回一张表的内容实现代码

    实现mysql多表联合查询中返回一张表的内容,可以通过使用UNION ALL操作符,将多个SELECT语句的结果集组合成一个结果集,最后将所有的查询结果拼成一个表。 下面是具体的实现步骤: 找到需要联合查询的多张表,根据关联字段进行连接操作(JOIN),例如连接表A和表B: SELECT A.*, B.* FROM table_A A INNER JOIN …

    database 2023年5月22日
    00
  • Redis为什么能抗住10万并发?揭秘性能优越的背后原因

    Redis是一个开源的,基于内存的,高性能的键值型数据库。它支持多种数据结构,包含五种基本类型 String(字符串)、Hash(哈希)、List(列表)、Set(集合)、Zset(有序集合),和三种特殊类型 Geo(地理位置)、HyperLogLog(基数统计)、Bitmaps(位图),可以满足各种应用场景的需求。 1. Redis简介 Redis是一个开…

    Redis 2023年4月14日
    00
  • mysql 设置自动创建时间及修改时间的方法示例

    当你在使用MySQL数据库时,经常会遇到需要设置自动创建时间及修改时间的需求,这在将来查询数据的时候非常方便,同时也可以更好的维护数据库。 下面是如何设置自动创建时间及修改时间的方法示例: 1. 创建表时使用默认函数 在创建表时,可以通过使用MySQL内置的函数CURRENT_TIMESTAMP来设置自动创建时间及修改时间。例如,我们创建一个名为user的表…

    database 2023年5月22日
    00
  • 常用SQL语句优化技巧总结【经典】

    讲解“常用SQL语句优化技巧总结【经典】”的完整攻略如下: 1. 理解SQL执行计划 SQL执行计划是指在执行SQL语句时,数据库系统通过查询优化器,根据表结构、索引等因素建立起来的一种执行路线。理解SQL执行计划是优化SQL的第一步。 在MySQL中,你可以通过 explain select语句 查看SQL的执行计划,进而判断SQL语句是否能够通过优化来提…

    database 2023年5月19日
    00
  • MySQL获取binlog的开始时间和结束时间(最新方法)

    首先,我们需要确定MySQL的binlog格式。MySQL支持行模式(row)、语句模式(statement)和混合模式(mixed),你可以通过执行SHOW GLOBAL VARIABLES LIKE ‘binlog_format’;来获取当前MySQL实例的binlog格式。 确定binlog格式后,我们可以通过以下方法获取MySQL的binlog的开始…

    database 2023年5月22日
    00
  • 记一次MySQL的优化案例

    我可以为您讲解一下“记一次MySQL的优化案例”的完整攻略。整个攻略的思路可以分为如下几个步骤: 确认问题的存在并理解问题:在开始优化前,我们需要先确认问题的存在并理解问题。通过查看MySQL的慢查询日志,可以获得一些慢查询语句的信息,包括哪些语句耗时长、执行频率高等等。同时也需要了解MySQL的优化技巧和原理,才能更好地定位问题和优化。 定位问题的原因:在…

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