Hibernate Spring Boot乐观锁异常捕获后仍输出日志问题
拦截乐观锁异常后仍输出错误日志的问题
我尝试拦截乐观锁异常并抛出自定义异常,但未达到预期效果:异常已被捕获,但控制台仍输出乐观锁错误日志。
相关代码示例
DAO层代码
public Entity getEntitieSimple(...) throws CustomException { Entity entity = // 执行查询操作 return entity; }
Service层代码
@Transactional(propagation = Propagation.REQUIRED, readOnly = true) public Entity recupererEntity() throws CustomException { Entity entity = null; try { entity = dao.getEntitieSimple(...); } catch (Exception exec) { throw new CustomException("自定义错误信息"); } return entity; } @Transactional(propagation = Propagation.REQUIRED) public void myUpdate() throws HibernateException { try { // 执行实体更新操作 } catch (HibernateException exec) { log.error("OPTIMISTIC: " + exec.getMessage()); throw new HibernateException("乐观锁更新失败"); } }
捕获异常后仍出现的错误日志
ERROR - 29-09-2022 09:59:44.204 - http-nio-8090-exec-5 - 3933807 - null - c:96e7d7ca8f7d5637 - org.hibernate.internal.ExceptionMapperStandardImpl - HHH000346: Error during managed flush [Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect) : [com.apicil.cosy.dop.domain.impl.Entity#1420]]
问题原因
Hibernate的乐观锁异常(StaleObjectStateException)并非在执行update代码时立即抛出,而是在事务提交前的自动flush阶段触发。你的try-catch仅包裹了业务更新代码,而Spring管理的事务会在方法执行完毕后自动执行flush和提交操作,此时抛出的异常不在你的catch范围内,导致Hibernate直接输出错误日志。
解决方案
1. 手动触发flush,提前抛出异常
在update业务代码后手动调用entityManager.flush(),让乐观锁异常在方法内部的try块中抛出,从而被catch捕获:
@Autowired private EntityManager entityManager; @Transactional(propagation = Propagation.REQUIRED) public void myUpdate() throws CustomException { try { // 执行实体更新操作 entityManager.flush(); // 手动触发flush,将异常提前到方法内抛出 } catch (StaleObjectStateException exec) { // 捕获具体的乐观锁异常 log.error("乐观锁冲突: " + exec.getMessage()); throw new CustomException("更新失败,数据已被其他事务修改"); } }
2. 捕获具体的异常类型
避免捕获泛化的HibernateException,改为捕获Hibernate的StaleObjectStateException或Spring封装的OptimisticLockingFailureException,精准拦截乐观锁异常,同时不影响其他异常的正常处理。
3. 调整事务边界
如果需要在事务外处理异常,可以将update逻辑拆分为事务内的操作和事务外的异常处理,但需注意确保事务在异常时正确回滚(可通过@Transactional(rollbackFor = CustomException.class)配置)。
内容的提问来源于stack exchange,提问作者Abdel
相关产品推荐
相关产品推荐

