ssm事务配置不起作用问题

在搭建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中配置的。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值