总的来说就是:
@controller
@Component
@WebServlet
Transactional放在这几个类的方法,但是这些类生成的代理类,没有生成事物注解相关的代理类
Transactional在这几个类的方法(不是public的方法里调用了其他类的Transactional方法),也是没有效果的
解决方法:统一把Transactional注解的方法放在@Service注解的类里边
原因:启动程序,现根据spring监听创建spring上下文,在spring扫描包的时候,会将TransactionServiceImpl对象放进spring上下文中。然后程序会继续加载springmvc的配置,创建springmvc上下文,这是扫描包时,会将TransactionServiceImpl对象放入springmvc上下文中。当访问接口时,是由springmvc上下文中的controller从springmvc上下文中获取到TransactionServiceImpl对象。当执行到@Transactional注解的方法时,spring aop会判断是否创建代理对象。问题就在这里,因为事务在spring上下文中配置,但是获取到的对象时在springmvc上下文中,所以spring无法创建代理对象,因此@Transactional注解最终不会生效。