电话
400 9058 355
XML上传事务失效主因是事务边界未覆盖全流程,需确保解析、入库等操作在同一个@Transactional方法内,避免自调用失效、异常被捕获不抛出、非事务数据源及BATCH模式缓存导致回滚失败。
XML文件上传后解析入库失败却无法回滚,通常不是因为“事务没加”,而是事务边界没包住整个解析+入库流程。Spring 的 @Transactional 默认只对 public 方法生效,且如果在同一个类里自调用(比如 upload() 调 parseAndSave()),代理失效,事务就形同虚设。
@Transactional 方法内,或通过 Spring 上下文重新获取代理对象调用try-catch 吞掉异常会导致事务不回滚;如需处理,捕获后必须 throw new RuntimeException(e) 或声明该异常为 rollbackForDataSource,JDBC 直连 Connection 或使用非事务型连接池(如 HikariCP 配置了 autoCommit=true)会绕过事务控制解析阶段(如用 SAXParser 或 JAXBContext)抛异常时,如果已执行过 INSERT 语句但事务尚未提交,理论上不会落库——前提是事务真正生效且未提前 flush。但有两类常见“伪残留”:

SELECT FOR UPDATE 锁行,而解析卡住导致锁超时,可能引发其他请求阻塞用 SqlSessionTemplate 或 @Mapper 接口做批量插入时,回滚失败常因以下配置问题:
ExecutorType.BATCH 模式下,MyBatis 缓存 SQL 并延迟执行,若在 batch 未 flush() 前异常退出,事务管理器看不到这些待执行语句,自然不触发回滚BATCH,改用 REUSE 或 SIMPLE;或确保在事务方法末尾显式调用 sqlSession.flushStatements()
如果生成了多条 INSERT,要确认每条都走的是同一个 SqlSession 实例,跨线程或手动 new SqlSession 会脱离事务上下文事务只管数据库,不管文件系统。XML 上传成功但入库失败时,文件可能已落盘(如存到 /upload/20251105/xxx.xml),下次重试会重复解析——这需要应用层幂等控制:
file_hash),入库前 SELECT COUNT(*) WHERE file_hash = ?,存在则跳过/success/ 或 /failed/ 子目录,而不是删或覆盖;失败后清理动作放在事务外异步做,避免拖慢主流程最易忽略的一点:事务传播行为。如果上传接口调用了另一个带 @Transactional(propagation = Propagation.REQUIRES_NEW) 的日志记录方法,它会在独立事务中提交,即使外层回滚,日志仍会写入——这类“半截日志”会让排查变得混乱。
邮箱:8955556@qq.com
Q Q:8955556
本文详解如何将Go官方present工具(用于生成HTML5...
PySNMP在不同版本中对SNMP错误状态(errorSta...
time.Sleep仅阻塞当前goroutine,其他gor...
PHPfopen()创建含特殊符号的文件名失败主因是操作系统...
WooCommerce中通过代码为分组产品动态聚合子商品的属...
io.ReadFull返回io.ErrUnexpectedE...
本文详解Yii2中控制器向视图传递ActiveRecord数...
本文详解为何通过wp_set_object_terms()为...
Pytest中使用@mock.patch类装饰器会导致补丁泄...
带缓冲的channel是并发安全的FIFO队列;make(c...