Spring Boot 全局异常处理怎么捕获脑裂异常
spring boot 的全局异常处理器无法直接通过注解捕获名为“脑裂”的特定异常,因为脑裂是分布式系统的一种状态而非标准 java 异常。要处理脑裂问题,必须针对引发脑裂的具体底层异常(如 redis 连接断开、数据库死锁或 zookeeper 会话超时)进行捕获,并在业务逻辑中引入重试机制或幂等性校验来恢复一致性。

如何捕获 Redis 连接中断引发的数据不一致
当 Redis 集群发生网络分区导致主从切换时,客户端可能抛出 JedisConnectionException 或 TimeoutException。在全局异常处理器中捕获这些异常后,应记录日志并触发补偿逻辑,例如重新读取权威数据源或标记缓存失效。

import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.RestControllerAdvice; import org.springframework.data.redis.RedisConnectionFailureException; @RestControllerAdvice public class GlobalExceptionHandler { @ExceptionHandler(RedisConnectionFailureException.class) public String handleRedisFailure(RedisConnectionFailureException ex) { // 记录脑裂相关日志 log.error("Redis connection lost, possible split-brain", ex); return "Cache invalidation triggered"; } }如何处理数据库死锁导致的交易失败
在分布式事务中,数据库死锁常被视为局部脑裂的表现。捕获 PessimisticLockingFailureException 或 DeadlockLoserDataAccessException 后,不应直接返回错误,而应启动本地重试策略,确保最终一致性。

import org.springframework.dao.PessimisticLockingFailureException; import org.springframework.web.bind.annotation.ExceptionHandler; @RestControllerAdvice public class GlobalExceptionHandler { @ExceptionHandler(PessimisticLockingFailureException.class) public String handleDeadlock(PessimisticLockingFailureException ex) { log.warn("Database deadlock detected, retrying transaction"); return "Transaction retried"; } }基于重试次数耗尽后的具体结果是什么
当重试机制达到最大次数仍无法解决冲突时,全局异常处理器将抛出自定义的 BusinessRuntimeException,前端收到明确的失败提示,此时需要人工介入或通过异步任务进行数据核对与修复。


















