请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

DDSTransactional注解,为什么会组合spring的@Transaction注解?

老师,为什么要在自定义的事务注解里加上spring的 @Transactional 注解?

@Documented
@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Transactional
public @interface DDSTransactional {
}

这样的话,感觉会导致spring接管整个事务,在开启事务时只获取一次connection,后面打上的DDS注解全部无效了,因为不会再重新去获取connection。

正在回答 回答被采纳积分+3

1回答

Tim老师 2023-09-26 15:50:04

同学你说的没错,但是你说的是spring的@Transactional的方式,而我们并没有完全使用spring找注解的方式,我们写了自己的PointCut,当它发现方法上面有对应的注解的时候,比如@DDS,就会进入对应interceptor拦截器,将对应的数据源设置到threadlocal对应的双端队列,而主方法上面如果存在DDSTransactional,也会进入对应interceptor拦截器,设置globalId,表示当前是在事务里面执行。最终主方法里面执行的每一个方法,如果加上了@DDS注解,相当于在threadlocal就设置了自己的数据源。最终获取connection执行的时候,当然是按照之前threadlocal设置的数据源拿出来,获取一个connction。同学这样说如果还不明白,建议反复看一下第五章的视频,从最基础的手写原理练习开始,这里可能会有点绕

0 回复 有任何疑惑可以回复我~
  • 提问者 lancelot_sj #1
    老师,我写了一个案例debug了一下,下面是代码:
    @DDS("test_db0")
        public int insertOrder()
        {
            String sql="insert into order_info values(?,?,?)";
            int multi_ds = jdbcTemplate.update(sql, 20, 1010, "multi ds");
            return multi_ds;
        }
    
        @DDS("test_mp")
        public int insertMp()
        {
            String sql="insert into tbl_employee values(?,?,?,?,?)";
            int multi_ds = jdbcTemplate.update(sql, 20,"mike","111@163.com", 1, "30");
            return multi_ds;
        }
    
    @DDSTransactional
        public void testDs2()
        {
            MultidsService multidsService = applicationContext.getBean(MultidsService.class);
            int countOrder = multidsService.insertOrder();
            System.out.println(countOrder);
            int countMp = multidsService.insertMp();
            System.out.println(countMp);
            int a = 1/0;
        }
    
    然后这种情况下,事务会有问题,spring的自己的事务没有被禁用,还是进spring事务的管理了,导致后面数据源都取的有问题。 因为我是跟着课程一点点敲代码的,是不是哪里漏了关闭spring自己事务的配置?
    将 DDSTransactional 里的 @Transactinal 注解去掉后,代码逻辑就正常
    回复 有任何疑惑可以回复我~ 2023-09-26 16:10:53
  • Tim老师 回复 提问者 lancelot_sj #2
    对的,这里不需要加上 @Transactinal, 可能是我后期测试另外一个问题忘记删了
    回复 有任何疑惑可以回复我~ 2023-09-26 16:19:08
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信