当前位置: 首页 > article >正文

Transactional 直接放在接口方法和类方法有什么不同

在使用 @Transactional 注解时,将其放在接口方法和实现类方法上有以下不同点和注意事项:


1. 基本区别

  • 接口方法上
    如果将 @Transactional 注解放在接口方法上,通常需要注意:

    • Spring AOP 默认使用的是基于 代理(proxy) 的机制来实现事务管理。
    • 接口上的注解 不会被代理类识别,因为代理类执行的是实现类的方法,而不是接口方法。
    • 因此,事务实际上 不会生效
  • 实现类方法上
    @Transactional 放在实现类的方法上是推荐的做法:

    • 事务会由代理对象正确识别和管理。
    • Spring 会在方法调用时拦截代理对象的方法,应用事务逻辑。

2. 事务生效机制

Spring AOP 使用动态代理来管理事务:

  • JDK 动态代理
    对于接口,Spring 使用基于接口的动态代理。因此,代理对象调用的是实现类的方法。
    • 接口上的 @Transactional 不会被代理识别。
  • CGLIB 动态代理
    对于没有接口的类或明确配置了使用 CGLIB,Spring 使用基于类的动态代理。
    • 此时事务注解需要在实现类方法或类上才能生效。

3. 推荐实践

  • @Transactional 注解写在 实现类的方法类上
  • 如果是通过接口定义业务方法,则只需要在实现类中使用 @Transactional 即可,避免误解。

4. 实际示例

错误用法(在接口上定义事务)
public interface UserService {
    @Transactional // 不推荐,事务不会生效
    void saveUser(User user);
}

@Service
public class UserServiceImpl implements UserService {
    @Override
    public void saveUser(User user) {
        // 方法体
    }
}
正确用法(在实现类上定义事务)
public interface UserService {
    void saveUser(User user);
}

@Service
public class UserServiceImpl implements UserService {
    @Override
    @Transactional // 推荐,事务会生效
    public void saveUser(User user) {
        // 方法体
    }
}
全局事务控制
@Service
@Transactional // 全类事务控制,推荐
public class UserServiceImpl implements UserService {
    @Override
    public void saveUser(User user) {
        // 方法体
    }
}

总结

  • 接口方法上的 @Transactional 对 Spring 的代理无效,事务不会生效。
  • 推荐在 实现类的方法类上 使用 @Transactional 注解。

http://www.kler.cn/a/413196.html

相关文章:

  • 前端项目的动态路由实现(vue)
  • 基于Matlab实现Gabo滤波器(源码)
  • PostgreSQL详细安装教程
  • Cocos编辑器
  • GCP Dataproc有什么特点,有什么最佳实践
  • 记录两次Unity编辑器和真机表现不符的情况,引用丢失等
  • css Grid网格布局
  • Zabbix 7.0 LTS Docker Compose 部署指南与遇到问题解决
  • 化工专业如何转软工
  • PyQt学习笔记
  • 安卓悬浮窗应用外无法穿透事件问题
  • 【解决方案】pycharm出现 为项目选择的Python解释器无效
  • 基于SpringBoot的数据结构系统设计与实现(源码+定制+开发)
  • 【机器学习】机器学习基础
  • 如何理解vue的diff算法?diff是什么?diff的比较方式?原理分析?
  • 计算机视觉 9-16章 (硕士)
  • 基于边缘智能网关的机房安全监测应用
  • 基于Matlab深度学习的CT影像识别系统研究与实现
  • 从零开始理解JVM:对象的生命周期之对象创建
  • Android音频框架总结
  • [linux本地部署ai 未完成]
  • 【Linux 篇】Docker 启动和停止的精准掌舵:操控指南
  • 2024年11月23日Github流行趋势
  • Golang runtime/trace包实战:深度性能分析与优化技巧
  • 汽车免拆诊断案例 | 2017款捷豹F-PACE车发动机偶尔怠速不稳
  • 如何在 Ubuntu 22 04 上安装和配置 Ansible 自动化平台