为什么同一个service下的synchronized方法调用另一个@Transaction方法,并发还会产生脏读,错误数据?

如下:a同步方法调用b事务方法,自己尝试过还是会出现脏数据。不知道为什么,必须要调用另一个service层的另一个b方法才能保证不产生脏数据。

@Service 
class aaa{

    public synchronized void a(){
        b();
    }

    @Transactional(rollbackFor = Exception.class)
    public void b() throws Exception {
        //...
    }

}

这个就是你对声明式事务有一定的了解,spring只会对有@Transaction注解的方法进行代理,对没有这个注解的方法不会进行代理。
由于你的a方法没有声明事务支持,所以a在进行调用时使用的是this,而不是代理对象,事务自然不会生效。

第一个回答已经解释的很明白,如果还不懂可以看看这边的文章事务不生效解析