V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
zxc1234
V2EX  ›  程序员

关于 spring 事务失效

  •  
  •   zxc1234 · 2020-04-17 18:46:52 +08:00 · 1976 次点击
    这是一个创建于 1712 天前的主题,其中的信息可能已经有所发展或是发生改变。

    网上找了一下 spring 事务失效的原因,感觉这篇文章比较好

    https://blog.csdn.net/andybbc/article/details/52913525

    这边文章中有个点想请教一下大伙:

    如果配置了事务, 就相当于又创建了一个类:UserServiceProxy

    public class UserServiceProxy extends UserService{ private UserService userService; ... public User getUserByName(String name){ User user = null; try{ // 在这里开启事务 user = userService.getUserByName(name);=======A 处 // 在这里提交事务 } catch(Exception e){ // 在这里回滚事务

            // 这块应该需要向外抛异常, 否则我们就无法获取异常信息了. 
            // 至于方法声明没有添加异常声明, 是因为覆写方法, 异常必须和父类声明的异常"兼容". 
            // 这块应该是利用的 java 虚拟机并不区分普通异常和运行时异常的特点.
            throw e;
        }
        return user;
    }
    ...
    

    }

    疑问点是:文章说所有的 private 方法, final 方法 和 static 方法 都无法 直接 添加 spring 的事务管理功能是因为于 java 继承时, 不能重写 private , final , static 修饰的方法.

    可是在这边的 A 处不是可以放入 UserService 的由 private , final , static 修饰的方法吗?

    谢谢大伙~

    7 条回复    2020-04-18 08:27:40 +08:00
    putaozhenhaochi
        1
    putaozhenhaochi  
       2020-04-17 20:19:34 +08:00 via Android
    可以了解下 Java 动态代理
    bobuick
        2
    bobuick  
       2020-04-17 20:32:22 +08:00
    你要是手动拿事务对象随便怎么都行。要是用 Spring 自己的事务注解,非 public 的方法都不行。它是基于动态代理实现的,动态代理正常情况下无法用在非 public 方法上
    zxc1234
        3
    zxc1234  
    OP
       2020-04-17 22:03:43 +08:00
    @putaozhenhaochi
    @bobuick 谢谢,请问 spring 事务是 jdk 动态代理还是 cglib 代理呢
    coer
        4
    coer  
       2020-04-17 22:06:53 +08:00 via iPad
    springboot 的 TransactionAutoConfiguration 类,默认是 cglib
    zxc1234
        5
    zxc1234  
    OP
       2020-04-17 22:07:53 +08:00
    @putaozhenhaochi
    @bobuick
    如果是 jdk 动态代理,但是好像在实际的开发中 service 并没有实现接口
    如果是 cglib 字节码织入,那么是不是 final 类的所有方法事务都不会生效呢?
    zxc1234
        6
    zxc1234  
    OP
       2020-04-17 22:08:36 +08:00
    @coer 那么是不是 final 类的所有方法,加事务都不会生效呢?
    luopengfei14
        7
    luopengfei14  
       2020-04-18 08:27:40 +08:00 via iPhone
    补充二楼,事物注解的方法必须由外部类调用。这样才能切面、生成代理管理事务
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5485 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 01:30 · PVG 09:30 · LAX 17:30 · JFK 20:30
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.