关于@Transactional注解的相关使用需要注意的地方

1. 一个功能是否要事务,必须纳入设计、编码考虑。不能仅仅完成了基本功能就ok。

2. 如果加了事务,必须做好开发环境测试(测试环境也尽量触发异常、测试回滚),确保事务生效。

3. 以下列了事务使用过程的注意事项,请大家留意。
    ①. 不要在接口上声明@Transactional ,而要在具体类的方法上使用 @Transactional 注解,否则注解可能无效。
    ②.不要图省事,将@Transactional放置在类级的声明中,放在类声明,会使得所有方法都有事务。故@Transactional应该放在方法级别,不需要使用事务的方法,就不要放置事务,比如查询方法。否则对性能是有影响的。
    ③.使用了@Transactional的方法,对同一个类里面的方法调用, @Transactional无效。比如有一个类Test,它的一个方法A,A再调用Test本类的方法B(不管B是否public还是private),但A没有声明注解事务,而B有。则外部调用A之后,B的事务是不会起作用的。(经常在这里出错)
    ④.使用了@Transactional的方法,只能是public,@Transactional注解的方法都是被外部其他类调用才有效,故只能是public。道理和上面的有关联。故在 protected、private 或者 package-visible 的方法上使用 @Transactional 注解,它也不会报错,但事务无效。


经过在ICORE-CLAIM中测试,效果如下:
    A.抛出受查异常XXXException,事务会回滚。
    B.抛出运行时异常NullPointerException,事务会回滚。
    C.Quartz中,execute直接调用加了@Transactional方法,可以回滚;间接调用,不会回滚。(即上文3点提到的)
    D.异步任务中,execute直接调用加了@Transactional方法,可以回滚;间接调用,不会回滚。(即上文3点提到的)
    E.在action中加上@Transactional,不会回滚。切记不要在action中加上事务。
    F.在service中加上@Transactional,如果是action直接调该方法,会回滚,如果是间接调,不会回滚。(即上文3提到的)

    G.在service中的private加上@Transactional,事务不会回滚。

### 关于 `@Transactional` 注解在私有方法上的生效分析 #### 私有方法上添加 `@Transactional` 注解的效果 当在一个被 `private` 修饰的方法上添加 `@Transactional` 注解时,该注解通常不会生效。这是因为 Spring AOP 使用动态代理机制来拦截方法调用并应用事务管理逻辑[^1]。对于公共方法(`public`),Spring 可以通过代理对象捕获到这些方法的调用,并在其前后插入事务处理逻辑。然而,由于 Java 的访问控制规则,代理无法拦截对私有方法的调用。 具体来说,在基于 JDK 动态代理的情况下,只有目标对象外部对其公开接口方法的调用会被代理拦截;而在 CGLIB 方式下,虽然可以增强非接口方法,但仍然无法绕过 Java 对私有方法的访问限制。因此,即使在私有方法上标记了 `@Transactional`,实际运行过程中也不会触发事务行为[^2]。 #### 实现原理剖析 Spring 的事务管理依赖于其内部维护的一个资源映射表,其中记录着当前线程所关联的数据源及其对应的数据库连接实例[^3]: ```java private static final ThreadLocal<Map<Object, Object>> resources = new NamedThreadLocal<>("Transactional resources"); ``` 此结构用于确保每次操作都能正确绑定至相应的事务上下文中。但是,这种设计前提是必须能够成功截取到目标方法执行前后的生命周期事件——而这正是私有方法难以满足的地方之一。 另外值得注意的是关于传播特性的设置也会影响最终效果。例如采用 NEVER 或者 SUPPORTS 这样的特殊配置可能进一步改变预期的行为模式[^4]。 综上所述,出于上述原因考虑,在开发实践中不建议尝试将 @Transactional 应用于 private 类型成员函数之上以免造成不必要的困惑或者潜在隐患存在。 ```java @Service public class ExampleService { @Transactional private void internalMethod() { // 此处即便抛出异常也无法回滚因为事务不起作用 } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值