Transactional mybatis plus 不生效

本文深入探讨了Spring框架中@Transactional注解的默认行为及其如何在遇到运行时异常时回滚事务。通过示例代码展示了如何自定义回滚策略,即在指定的Exception类抛出时触发事务回滚,并在Controller或Service层捕获异常进行处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

@Transactional 默认是当方法抛出RuntimeException 才会回滚,可以使用
@Transactional(rollbackFor = Exception.class) 指定具体异常时 就回滚

代码:

@Transactional(rollbackFor = Exception.class)
public void testDel() throws Exception {
        Map<String,Object> params = new HashMap<>();      
        if(true){
                throw new Exception("测试");
        }
}

然后在controller 或service 调用该方法时时 去获取异常

try{

testDel()

}catch(){

...

}

 

### 解决 MyBatis Plus 中 `@DS` 注解在事务环境下不生效的问题 当遇到 MyBatis Plus 的 `@DS` 注解在事务环境中不起作用的情况时,通常是因为数据源切换机制未能正确识别并应用指定的数据源。为了确保多数据源配置下的事务管理正常工作,需遵循特定的最佳实践。 #### 数据源动态切换原理 Spring AOP 和 Spring Transaction Manager 都依赖于代理对象来实现功能。如果 `@Transactional` 和 `@DS` 同时存在,则需要保证这两个注解都能被同一个代理所拦截处理[^1]。默认情况下,Spring 使用 JDK 动态代理或 CGLIB 来创建这些代理实例;然而,在某些场景下可能会导致 `@DS` 不起效的问题。 #### 实现方案 一种有效的解决方案是在启动类上添加自定义切面逻辑,通过这种方式可以强制执行数据源的选择过程: ```java import com.baomidou.dynamic.datasource.annotation.DS; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Aspect; @Aspect public class DataSourceAop { @Around("@annotation(DS)") public Object around(ProceedingJoinPoint point) throws Throwable { DS ds = getDs(point); DynamicDataSourceContextHolder.push(ds.value()); try { return point.proceed(); } finally { DynamicDataSourceContextHolder.clear(); } } private static DS getDs(ProceedingJoinPoint joinPoint){ MethodSignature signature = (MethodSignature)joinPoint.getSignature(); Class<?> targetClass = joinPoint.getTarget().getClass(); // 获取方法上的@DS注解 Method method = targetClass.getMethod(signature.getName(),signature.getParameterTypes()); return method.getDeclaredAnnotation(DS.class); } } ``` 此代码片段展示了如何利用 AspectJ 创建一个环绕通知(`around`),它会在任何带有 `@DS` 注解的方法调用前后自动设置和清除当前线程绑定的数据源名称。这有助于确保即使在复杂的事务传播上下文中也能正确地选择目标数据库连接池[^2]。 此外,还需确认项目中的 `application.yml` 或者其他形式的配置文件已经正确定义了多个数据源以及相应的主键策略等必要参数,并且启用了 spring boot starter dynamic-datasource 扩展支持[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值