关于 spring 事务失效

2020-04-17 18:46:52 +08:00
 zxc1234

网上找了一下 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 修饰的方法吗?

谢谢大伙~

1798 次点击
所在节点    程序员
7 条回复
putaozhenhaochi
2020-04-17 20:19:34 +08:00
可以了解下 Java 动态代理
bobuick
2020-04-17 20:32:22 +08:00
你要是手动拿事务对象随便怎么都行。要是用 Spring 自己的事务注解,非 public 的方法都不行。它是基于动态代理实现的,动态代理正常情况下无法用在非 public 方法上
zxc1234
2020-04-17 22:03:43 +08:00
@putaozhenhaochi
@bobuick 谢谢,请问 spring 事务是 jdk 动态代理还是 cglib 代理呢
coer
2020-04-17 22:06:53 +08:00
springboot 的 TransactionAutoConfiguration 类,默认是 cglib
zxc1234
2020-04-17 22:07:53 +08:00
@putaozhenhaochi
@bobuick
如果是 jdk 动态代理,但是好像在实际的开发中 service 并没有实现接口
如果是 cglib 字节码织入,那么是不是 final 类的所有方法事务都不会生效呢?
zxc1234
2020-04-17 22:08:36 +08:00
@coer 那么是不是 final 类的所有方法,加事务都不会生效呢?
luopengfei14
2020-04-18 08:27:40 +08:00
补充二楼,事物注解的方法必须由外部类调用。这样才能切面、生成代理管理事务

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/663549

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX