关于并发编程一些问题与解决--事务回滚@Transactional

先贴一下代码吧
    @Transactional
    @Override
    public int upSunp(Integer a_id) {
        //查询数据库
        QueryWrapper<Animal> animalQueryWrapper = new QueryWrapper<>();
        animalQueryWrapper.eq("a_id", a_id);
        Animal animal_Like = animalMapper.selectOne(animalQueryWrapper);
        if (animal_Like != null) {
            int uped = animal_Like.getALike();
             animal_Like.setALike(uped + 1);
            animalMapper.updateById(animal_Like);

            return uped;
        }

        return 0;
    }

在这段代码中会遇到并发编程所遇到的问题,多个线程同时访问了共享资源,导致计算失误,比如在不加事务回滚的注解时,最后结果是+2,并不是+1,但事实只有一个用户发起了调用这个接口,并无其他用户主动开启另一个线程,但目前我也并没有找到另一个线程在哪里,是什么线程调用了这个方法或者+1行代码,但目前@Transactional可以解决这个问题,在标注@Transactional后,Spring执行这个 方法时会单独对这个线程(方法)开启一个数据库事务,其他线程无法进行干预这个共享资源,在这个方法执行结束后根据方法执行情况决定是提交事务还是回滚事务。这就是事务的原子性,各个原子間(数据库事务)相互隔离,按照我的理解就是,两人都有自己的苹果要放在同一个桌子上,在没有开启事务之前,两个线程可能会进行苹果的抢夺来放在桌子上,比如a已经放了一个苹果在桌上,此时b也要放,但是b没放自己的,拿了A的放了桌上,这就导致,一个线程原本是+1却导致了+2,开启事务之后,双方各放自己的,互不干扰,这就是原子性.大的事务里面包了小的事务,一个方法为大的事务,每一个线程访问为小的事务

posted @ 2024-03-22 21:38  OriginCat  阅读(3)  评论(0编辑  收藏  举报