【单体架构事务失效解决方式之___代理对象加锁】

单体架构__用户限买

一个id一单的多线程事务失效问题解决
背景介绍:有一种情况,我们在使用@Synchronized的时候出现失效情况。
经过排查,是因为使用了this.当前对象,他现在使用的是目标对象加锁失效,使用代理对象加锁就不失效了。特此记录以下从获取,到解决的步骤

1.导入依赖

        org.aspectj
        aspectjweaver
    
2.启动类加注解
@EnableAspectJAutoProxy(exposeProxy = true)

这个注解会在启动的时候暴露代理对象

3.具体业务场景使用

背景介绍:我这边是将需要加锁的代码抽取成了一个方法,ctrl+alt+m,然后用Synchronized锁的整个方法。

//        获取当前代理对象,将此对象作为锁
        Object obj = AopContext.currentProxy();
//        当前此对象可以强转,也可以是接口或者类
//        可以在server中定义方法,直接用server引用也可以这样获取到了代理对象加锁,可以保证事务不失效
        synchronized (obj){
//            需要被封装的代码块
        }

注:上方强转的应该是当前实现类的server接口,然后用那个接口,获取到当前实现类的方法,这个方法是加了事务控制的方法,然后在引用的地方外面加sync锁就行了,解决了事务失效

4.扩展

toString方法里面有一个intern()的方法,在创建字符串的时候,优先去字符串常量池里面查找,有的话返回字符串常量池地址引用。

如果这种方法帮你解决了问题,帮点个赞哦。

你可能感兴趣的:(java,开发语言)