# 1. 声明式事务(@Transactional、Spring AOP)的工作原理,代理拦截? A 它通过修改目标类的字节码直接生效,无需代理 B 自调用也会被代理拦截,事务始终生效 C 它通过 AOP 代理在方法前后拦截开启/提交/回滚事务,类内部自调用不经过代理会导致事务失效 ✓ 正确答案 D @Transactional 只作用于方法内部提交,与代理无关
# 2. 事务边界与异常的 rollbackFor、noRollbackFor 设置? A 默认对所有异常都回滚 B noRollbackFor 用于扩大回滚范围 C 默认只回滚 RuntimeException 与 Error,rollbackFor 可显式让受检异常也回滚,noRollbackFor 指定不回滚的异常 ✓ 正确答案 D rollbackFor 只能用于运行时异常
# 3. Hibernate 批量操作,StatelessSession、JDBC BATCH? A 批量插入只能逐条执行,无法优化 B StatelessSession 维护完整一级缓存,适合批量 C JDBC BATCH 会增加网络往返 D 普通 Session 批量插入时一级缓存会膨胀,可用 StatelessSession 或 JDBC BATCH 优化 ✓ 正确答案
# 4. JDBC 批处理(addBatch、executeBatch)的实现与性能? A executeBatch 会逐条发送 SQL,增加往返 B addBatch/executeBatch 将多条语句一次性发送减少往返,MySQL 可用 rewriteBatchedStatements 合并为多值 INSERT ✓ 正确答案 C 批处理自动开启事务并自动提交 D 批处理无需控制批大小
# 5. MyBatis 批量操作,foreach、ExecutorType.BATCH? A foreach 只适用于单条插入 B foreach 把多条拼成一条多值 SQL,ExecutorType.BATCH 复用语句分批执行,两者都减少往返 ✓ 正确答案 C ExecutorType.BATCH 需要拼接 SQL 字符串 D 两者等价,无区别
# 6. 大文件导入(CSV 百万行)的工程实践,分批提交、临时表、去重与失败重试 A 应逐行 INSERT 并单条提交,保证性能 B 分批提交会导致数据丢失 C 导入无法去重,只能全量覆盖 D 用 LOAD DATA/COPY 载入临时表,配合分批提交、唯一约束去重与断点续传,实现高性能与可恢复 ✓ 正确答案
# 7. rewriteBatchedStatements 参数(MySQL JDBC)对 INSERT 性能的优化? A 它默认开启,无需配置 B 开启后驱动把批量 INSERT 重写为一条多值 INSERT,减少往返,显著提升批量性能 ✓ 正确答案 C 它只影响 UPDATE,不影响 INSERT D 开启后批量插入变慢
# 8. @Transactional 自调用失效问题(AOP 代理不拦截内部调用)? A 类内部 this 调用不经过代理,事务拦截器不执行导致失效,可通过注入自身代理或拆分 Bean 解决 ✓ 正确答案 B 自调用也会被代理拦截,事务正常生效 C 自调用失效与代理无关 D 自调用只影响只读事务
# 9. PROPAGATION_REQUIRED 的语义? A 它总是新建一个独立事务 B 它只支持只读事务 C 它强制要求外层必须无事务 D 当前已有事务则加入,没有则新建,是默认传播级别 ✓ 正确答案
# 10. StatelessSession 的应用? A 它维护完整一级缓存,适合复杂对象图 B 它无缓存、无级联、无脏检查,适合大批量数据操作,但返回实体是游离状态 ✓ 正确答案 C 它支持延迟加载与级联保存 D 它与普通 Session 完全等价
# 11. Spring 事务传播 NESTED 的应用场景,基于保存点实现部分回滚的机制,与 REQUIRED/REQUIRES_NEW 的差异及对底层保存点能力的依赖? A NESTED 与 REQUIRES_NEW 一样,是完全独立的新事务 B NESTED 不需要任何数据库特性支持 C NESTED 内层异常会导致整个外部事务回滚 D NESTED 基于保存点实现部分回滚,内层失败仅回滚到保存点,依赖数据库保存点能力 ✓ 正确答案
# 12. Spring REQUIRES_NEW 的应用场景,审计日志与异步补偿等需独立提交/回滚的子事务,其新增连接与延长锁持有时间的代价如何避免滥用? A 它加入外层事务,共享提交/回滚 B 它开启独立事务,适合审计日志等需独立提交的子事务,但会新增连接并延长锁持有时间,应避免滥用 ✓ 正确答案 C 它不占用连接,无代价 D 它与外层事务共享锁
# 13. @Transactional rollbackFor 的应用,为何默认仅回滚 RuntimeException 与 Error?对受检异常显式声明 rollbackFor 的实践,以及异常被吞掉导致事务不生效的陷阱? A 默认对所有异常回滚,包括受检异常 B 吞掉异常不影响事务回滚 C 默认只回滚 RuntimeException/Error,受检异常需显式 rollbackFor;事务方法内吞掉异常会导致该回滚却提交 ✓ 正确答案 D 受检异常默认也回滚,无需配置
# 14. MyBatis 流式查询(Cursor)/JDBC fetchSize 防止大结果集 OOM A 大结果集应一次性加载到内存,效率最高 B fetchSize 只影响网络速度,不影响内存 C MyBatis Cursor 与 JDBC fetchSize 配合数据库游标分批拉取,避免一次性加载导致 OOM ✓ 正确答案 D 流式查询不需要关闭游标
# 15. 批量导入的断点续传与对账,大批量导入中断后如何从检查点恢复,导入前后如何用行数/校验和对账? A 中断后必须从头开始,无法恢复 B 对账只能人工核对,无法自动化 C 用检查点记录进度实现断点续传,导入前后用行数/校验和对账验证完整性 ✓ 正确答案 D 断点续传与幂等无关,重复导入也安全
# 16. 批量大小(batch size)的调优,太大导致锁竞争与内存压力、太小吞吐不足,如何结合数据库负载实测确定? A 批越大越好,无上限 B 批太大导致锁竞争与内存压力,太小吞吐不足,需结合数据库负载实测确定最优点 ✓ 正确答案 C 批大小与性能无关,随意即可 D 批越小吞吐越高
# 17. 事务边界对批量操作的影响,分批提交的间隔与一致性窗口如何权衡,出错时回滚范围如何控制(整批 vs 单条)? A 整批提交与逐条提交在一致性上完全一样 B 事务边界不影响批量操作 C 分批提交形成按批一致的窗口,需权衡锁/性能与一致性,出错时需决定整批回滚还是单条跳过 ✓ 正确答案 D 出错时只能整批回滚,无法控制
# 18. 批量写入与锁/日志的代价,批量 INSERT 对行锁、redo/binlog 与从库复制延迟的影响,如何通过分批与错峰控制? A 批量写入只影响主库,不影响从库 B 批量写入不产生 redo/binlog C 批量 INSERT 会持有大量行锁并产生 redo/binlog 写放大,可能加剧从库复制延迟,需分批与错峰控制 ✓ 正确答案 D 批越大从库复制延迟越小
# 19. 批量操作与 ORM 一级缓存的交互(批量插入时 Session 缓存膨胀) A 批量插入与一级缓存无关 B 一级缓存会自动限制批量插入,不会膨胀 C 批量插入时实体全部进入一级缓存导致缓存膨胀,可用定期 flush+clear 或 StatelessSession 控制 ✓ 正确答案 D 缓存膨胀不影响内存