Spring 事务管理

共 33 题
#

1. @Transactional 的传播行为(Propagation)的 7 种语义

A NEVER 允许存在事务
B 所有传播行为都新建独立事务
C MANDATORY 允许无事务执行
D REQUIRED 默认加入或新建事务,REQUIRES_NEW 总是新建独立事务,NESTED 基于保存点嵌套 ✓ 正确答案
#

2. @Transactional 的隔离级别(Isolation)与数据库默认差异

A 隔离级别与并发问题无关
B 所有数据库默认 READ_UNCOMMITTED
C SERIALIZABLE 性能最高
D MySQL 默认 REPEATABLE_READ,Oracle/SQL Server 默认 READ_COMMITTED,DEFAULT 采用数据库默认 ✓ 正确答案
#

3. @Transactional(readOnly = true) 的优化与数据库只读事务

A 它只对数据库生效,与应用无关
B 它强制禁止所有写操作
C 它跳过 JPA 脏检查并可能设置连接只读,是查询类方法的性能与语义优化 ✓ 正确答案
D 它没有优化效果
#

4. Spring 6.x 的事务管理变更

A 事务 API 完全重写
B 主要变更是适配 Jakarta EE 命名空间与 Java 17 基线,核心事务语义保持稳定 ✓ 正确答案
C 传播行为被移除
D 与 Spring 5 完全一致
#

5. Spring Framework 7 在 JDK 25 虚拟线程下事务同步的线程绑定边界

A 虚拟线程下 ThreadLocal 自动跨线程传播
B 事务通过 ThreadLocal 绑定线程,虚拟线程下事务也必须在同一线程内完成,跨线程会丢失 ✓ 正确答案
C 事务与线程无关
D 虚拟线程下事务无需线程绑定
#

6. Spring 事务与 JPA 的协作(JpaTransactionManager)

A 它只能提交不能回滚
B 它只管理 JDBC 连接,与 JPA 无关
C JPA 不需要事务管理器
D 它管理 JPA 的 EntityManager 与事务,协调持久化上下文与事务边界 ✓ 正确答案
#

7. Spring 事务与 JTA 的集成(Atomikos/Narayana)

A JTA 不需要 XA 数据源
B JTA 只用于单数据源
C JtaTransactionManager 配合 XA 数据源与 Atomikos/Narayana 实现基于 2PC 的分布式事务 ✓ 正确答案
D JTA 比普通事务更快
#

8. Spring 事务与 Seata 分布式事务的协作

A @GlobalTransactional 组织全局事务,内部 @Transactional 本地事务通过 XID 关联,实现分布式一致 ✓ 正确答案
B Seata 与 Spring 事务无关
C Seata 只支持单库
D Seata 不依赖本地事务
#

9. Spring 事务抽象(PlatformTransactionManager)与编程式/声明式

A 编程式事务无侵入
B 声明式事务必须手写提交回滚
C PlatformTransactionManager 统一抽象,编程式用 TransactionTemplate,声明式用 @Transactional,二者都基于该抽象 ✓ 正确答案
D 事务管理器与 JPA/JDBC 无关
#

10. Spring 事务的 readOnly 标志在 JDBC 驱动层面的优化(如 MySQL 的事务访问模式)

A readOnly 对数据库无任何影响
B readOnly 会调用 Connection.setReadOnly 让数据库使用只读事务访问模式,减少开销 ✓ 正确答案
C readOnly 只影响应用层,不影响连接
D readOnly 会提升写性能
#

11. Spring 事务的 rollback 规则(RuntimeException vs Checked Exception)

A 默认受检异常回滚、运行时异常不回滚
B 默认所有异常都回滚
C 默认 RuntimeException 回滚、Checked Exception 不回滚,可用 rollbackFor 覆盖 ✓ 正确答案
D 回滚规则无法配置
#

12. Spring 事务的 rollbackFor/noRollbackFor 在 RuntimeException 默认回滚语义下的精细控制

A 两者都必填
B rollbackFor 增加回滚异常,noRollbackFor 排除回滚异常,在默认语义上精细控制 ✓ 正确答案
C rollbackFor 只影响受检异常
D noRollbackFor 只影响运行时异常
#

13. Spring 事务的传播行为(PROPAGATION_REQUIRED/REQUIRES_NEW/NESTED)在嵌套调用中的差异

A NESTED 与 REQUIRED 完全等价
B 三者共享同一事务
C 三者都新建独立事务
D REQUIRED 加入外层事务,REQUIRES_NEW 独立事务,NESTED 基于保存点局部回滚 ✓ 正确答案
#

14. Spring 事务的隔离级别(READ_COMMITTED/REPEATABLE_READ/SERIALIZABLE)

A READ_COMMITTED 防脏读,REPEATABLE_READ 防不可重复读,SERIALIZABLE 防所有并发问题但性能最低 ✓ 正确答案
B 三者性能相同
C SERIALIZABLE 性能最高
D READ_COMMITTED 防幻读
#

15. TransactionTemplate 编程式事务的工程应用

A 它与 @Transactional 完全等价
B 它只能用于声明式事务
C 它无法手动回滚
D 它是编程式事务模板,execute 回调内定义事务边界,适合精细控制与自调用失效场景 ✓ 正确答案
#

16. 事务与虚拟线程(synchronized 锁)的协作

A synchronized 在虚拟线程下无任何影响
B 事务内用 synchronized 包住阻塞操作可能钉住载体线程并导致持锁死锁,应尽量用 ReentrantLock ✓ 正确答案
C 事务与锁无关
D 虚拟线程下 synchronized 自动释放
#

17. 事务与锁顺序(避免死锁)的工程实践

A 死锁无法预防
B 锁顺序无关紧要
C 事务越长越安全
D 统一锁获取顺序、缩短事务持锁范围、避免长持锁可有效规避死锁 ✓ 正确答案
#

18. 事务事件(@TransactionalEventListener)与业务解耦

A 默认在事务提交后(AFTER_COMMIT)执行后续操作,实现业务解耦与一致性 ✓ 正确答案
B 它在事务回滚后也默认执行
C 它与事务无关
D 它只能同步执行
#

19. 内层事务回滚标记(rollback-only)如何导致外层 UnexpectedRollbackException,如何避免与排查

A 它只出现在 REQUIRES_NEW 场景
B 它由数据库死锁导致
C 内层 REQUIRED 回滚标记整个事务 rollback-only,外层捕获异常后仍提交即抛 UnexpectedRollbackException ✓ 正确答案
D 它是正常提交的标志
#

20. 事务传播与 Spring 事件可靠投递

A 事件在事务回滚后也默认投递
B @TransactionalEventListener 在事务提交后投递事件,保证事件执行与事务提交对齐 ✓ 正确答案
C 事件投递与事务无关
D 事件总是可靠投递
#

21. 事务同步(TransactionSynchronization)与回调

A 它无法感知回滚状态
B 它只能监听提交
C 它与事务无关
D 它提供事务提交/回滚/完成回调,可在事务边界执行一致逻辑 ✓ 正确答案
#

22. 事务在 Spring Modulith 下的边界

A 模块间必须用分布式事务
B 跨模块应共用同一事务
C 事务与模块无关
D 事务应限制在模块内部,跨模块一致靠事件驱动与最终一致而非分布式事务 ✓ 正确答案
#

23. 事务失效的常见场景(异常被吞、私有方法、线程切换)

A 事务对 private 方法自动生效
B 只有异常被吞会失效
C 异常被吞、private/final 方法、自调用、线程切换都会导致事务失效 ✓ 正确答案
D 跨线程时事务自动传播
#

24. 事务方法中调用 Thread.sleep 的边界

A 虚拟线程下 sleep 无风险
B sleep 在事务内无任何影响
C sleep 会加快事务提交
D 事务内 sleep 会延长连接占用与锁持有,制造长事务风险,应避免 ✓ 正确答案
#

25. 嵌套事务(PROPAGATION_NESTED)与保存点的关系

A NESTED 与 REQUIRES_NEW 完全等价
B NESTED 基于保存点,内层回滚只回滚到保存点,外层事务仍可提交 ✓ 正确答案
C NESTED 内层回滚会回滚整个外层事务
D NESTED 不依赖保存点
#

26. @Transactional 在 Spring 6.x 的 Propagation 演进

A 传播行为被完全重写
B Propagation 语义基本稳定,演进主要在响应式事务适配与 API 清晰化 ✓ 正确答案
C 7 种传播被移除
D 响应式事务与传播无关
#

27. @Transactional(propagation = REQUIRES_NEW) 的连接占用

A REQUIRES_NEW 不占用额外连接
B REQUIRES_NEW 共享外层连接
C REQUIRES_NEW 新建独立事务需额外占用连接,深嵌套会耗尽连接池 ✓ 正确答案
D 连接占用与传播无关
#

28. @Transactional(timeout = ...) 的边界

A timeout 与锁等待超时相同
B timeout 设置事务超时,超时强制回滚并抛异常,防止长事务 ✓ 正确答案
C timeout 超时后事务继续提交
D timeout 只影响查询
#

29. 事务在 GraalVM Native Image 下的限制

A 反射与 Native 无冲突
B Native 下事务完全可用,无需处理
C Native 下不能使用事务
D 事务的动态代理与反射需 Spring AOT 提前生成元数据,CGLIB 运行时增强在 Native 受限 ✓ 正确答案
#

30. @Transactional 的 AOP 代理机制(JDK 动态代理 vs CGLIB)与自调用、final 方法失效的关系

A private 方法事务自动生效
B JDK 动态代理可拦截 final 方法
C 自调用经过代理,事务生效
D 默认 CGLIB 子类代理,自调用绕过代理、final 不可覆写、private 不可拦截均导致事务失效 ✓ 正确答案
#

31. 大事务/长事务的危害(连接占用、锁持有、UNDO 膨胀)与拆分策略

A 长事务无危害
B 长事务导致连接占用、锁持有、UNDO 膨胀,应拆分为小事务并移出非 DB 操作 ✓ 正确答案
C 事务越长性能越好
D UNDO 膨胀与事务时长无关
#

32. 事务失效场景汇总,自调用、非 public 方法、异常被吞、propagation 配置错误等如何?

A 只有自调用会失效
B 自调用、非 public、final、异常被吞、propagation 配置错误、类未受 Spring 管理等都会失效 ✓ 正确答案
C 非 public 方法事务正常
D 异常被吞不影响事务
#

33. @Transactional 的 rollbackFor 与默认回滚规则,为什么运行时异常才默认回滚?

A 默认受检异常回滚
B 默认所有异常回滚
C 默认 RuntimeException 回滚、Checked 不回滚,因为受检异常视为业务预期 ✓ 正确答案
D rollbackFor 无法覆盖默认