【单体架构事务失效解决方式之___代理对象加锁】
2023-12-13 10:28:28
单体架构__用户限买
一个id一单的多线程事务失效问题解决
背景介绍:有一种情况,我们在使用@Synchronized的时候出现失效情况。
经过排查,是因为使用了this.当前对象,他现在使用的是目标对象加锁失效,使用代理对象加锁就不失效了。特此记录以下从获取,到解决的步骤
1.导入依赖
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
</dependency>
2.启动类加注解
@EnableAspectJAutoProxy(exposeProxy = true)
这个注解会在启动的时候暴露代理对象
3.具体业务场景使用
背景介绍:我这边是将需要加锁的代码抽取成了一个方法,ctrl+alt+m,然后用Synchronized锁的整个方法。
// 获取当前代理对象,将此对象作为锁
Object obj = AopContext.currentProxy();
// 当前此对象可以强转,也可以是接口或者类
// 可以在server中定义方法,直接用server引用也可以这样获取到了代理对象加锁,可以保证事务不失效
synchronized (obj){
// 需要被封装的代码块
}
注:上方强转的应该是当前实现类的server接口,然后用那个接口,获取到当前实现类的方法,这个方法是加了事务控制的方法,然后在引用的地方外面加sync锁就行了,解决了事务失效
4.扩展
toString方法里面有一个intern()的方法,在创建字符串的时候,优先去字符串常量池里面查找,有的话返回字符串常量池地址引用。
如果这种方法帮你解决了问题,帮点个赞哦。
文章来源:https://blog.csdn.net/PaoShan/article/details/134833069
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!