总的来说就是:
@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注解最终不会生效。

文章讨论了在@Controller、@Component和@WebServlet注解的类中使用@Transactional注解导致事务管理失效的问题。原因是SpringMVC上下文中获取的对象未被Spring事务代理处理。解决方案是将@Transactional注解的方法移到@Service注解的类中,确保事务配置在Spring上下文生效。
1761

被折叠的 条评论
为什么被折叠?



