ssm事务配置不起作用问题

xiaoxiao2021-02-28  69

在搭建ssm项目过程中遇到了,配置的事务不起作用的问题,百度了下,原因大概就是包扫描的问题:spring的配置文件application.xml中包扫描不需要扫描@Controller注解的, 具体如下:

<context:component-scan base-package="com.practice.controller"> <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/> <context:exclude-filter type="annotation" expression="org.springframework.web.bind.annotation.ControllerAdvice"/> <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Repository"/> </context:component-scan>

springMVC配置文件springMVC-servlet.xml中只需要扫描@Controller注解的,具体如下:

<context:component-scan base-package="com.practice.controller"> <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/> <context:include-filter type="annotation" expression="org.springframework.web.bind.annotation.ControllerAdvice"/> </context:component-scan>事务配置我用的是声明式事务配置,在application.xml中配置的,具体如下:

<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"/> </bean> <!-- 开启事务控制的注解支持 --> <tx:annotation-driven transaction-manager="transactionManager"/>

用的时候只需要在需要事务管理的类上或方法上加@Transactional就行,当然可以在@Transactional后进行更加详细的配置,此处不是重点,就不讲了。

按道理来说这样配置后就可以了,可是当进行插入时明明有异常却不能回滚,也就是事务根本没有起作用,苦思之后,发现事务配置在了控制层也就是@Controller中,可是有什么关系吗?事务配置在Controller层中难道不可以吗?应该没有规定不能配置在事务中吧,继续百度事务可不可以配置在Controller层中,答案可以,那为什么不起效呢,见鬼了。再仔细看看配置文件,发现了问题:在application.xml文件中我已经排除了扫描@Controller的类,那么再将事务加在@Controller注解的类上,事务肯定也不会被扫描,那它肯定不会有效,所以我将事务配置放到了spring MVC的配置文件中,然后跟预想一样,事务起效了。

所以反过来,如果不移动配置,那么就需要将@Transactional加到service层中的类或方法上。

由此可见,我们就需要养成良好的分层习惯,因为一般的公司和项目都会分层,而如果我们没分层或者分的混乱,那么可能在别人那不会遇到的问题自己就会遇到,即使代码可能完全一样。另外,还说明了一个问题:那就是spring容器和spring mvc容器之间是层级关系的,具体的就是spring容器是spring mvc容器的父容器,在spring中的配置可以整个项目使用,spring mvc中的配置只能在spring mvc 作用范围内,也就是说spring mvc可以使用spring中配置的,spring不可以使用spring mvc中配置的。

转载请注明原文地址: https://www.6miu.com/read-97121.html

最新回复(0)