DDSTransactional注解,为什么会组合spring的@Transaction注解?
来源:5-26 【解决方案】源码深度适配解决多数据源事务问题(一)

lancelot_sj
2023-09-26
老师,为什么要在自定义的事务注解里加上spring的 @Transactional 注解?
@Documented
@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Transactional
public @interface DDSTransactional {
}
这样的话,感觉会导致spring接管整个事务,在开启事务时只获取一次connection,后面打上的DDS注解全部无效了,因为不会再重新去获取connection。
写回答
1回答
-
Tim老师
2023-09-26
同学你说的没错,但是你说的是spring的@Transactional的方式,而我们并没有完全使用spring找注解的方式,我们写了自己的PointCut,当它发现方法上面有对应的注解的时候,比如@DDS,就会进入对应interceptor拦截器,将对应的数据源设置到threadlocal对应的双端队列,而主方法上面如果存在DDSTransactional,也会进入对应interceptor拦截器,设置globalId,表示当前是在事务里面执行。最终主方法里面执行的每一个方法,如果加上了@DDS注解,相当于在threadlocal就设置了自己的数据源。最终获取connection执行的时候,当然是按照之前threadlocal设置的数据源拿出来,获取一个connction。同学这样说如果还不明白,建议反复看一下第五章的视频,从最基础的手写原理练习开始,这里可能会有点绕
022023-09-26
相似问题