声明式事务与批量读写与导入

共 19 题
#

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 缓存膨胀不影响内存