Spring MVC +Spring +mybatis 整合事务处理

来源:互联网 发布:我的淘宝店铺怎么注销 编辑:程序博客网 时间:2024/05/20 04:29

因为spring的context是父子容器,所以会产生冲突,由ServletContextListener产生的是父容器,springMVC产生的是子容器,子容器Controller进行扫描装配时装配了@Service注解的实例,而该实例理应由父容器进行初始化以保证事务的增强处理,所以此时得到的将是原样的Service(没有经过事务加强处理,故而没有事务处理能力。

主要配置文件如下

1、spring.xml

<!-- 自动扫描包 -->
<context:component-scan base-package="com.zhouyuan.*">
<context:exclude-filter type ="annotation" expression= "org.springframework.stereotype.Controller" />
</context:component-scan>

<!-- 配置数据源 -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close">
<property name="driverClassName" value="oracle.jdbc.driver.OracleDriver" />
<property name="url" value="jdbc:oracle:thin:@localhost:1521:orcl" />
<property name="username" value="scott" />
<property name="password" value="tiger" />
</bean>

<!-- 配置事务管理 -->
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
<!-- 事务注解驱动,标注@Transactional的类和方法将具有事务性 -->  
<tx:annotation-driven transaction-manager="transactionManager" /> 
<!-- spring和MyBatis完美整合,不需要mybatis的配置映射文件 -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="configLocation" value="classpath:mybatis-config.xml"></property>
<property name="dataSource" ref="dataSource" />
</bean>

2、springmvc的配置文件

<!-- 配置扫描包 -->
<context:component-scan base-package="com.zhouyuan.*">
<context:include-filter type="annotation"
expression="org.springframework.stereotype.Controller" />
<context:exclude-filter type="annotation"
expression="org.springframework.stereotype.Service" />
</context:component-scan>
<!-- 默认的注解映射的支持 -->
<mvc:annotation-driven />
<!-- 对静态资源文件的访问 -->
<mvc:default-servlet-handler />

3、在service层配置事务

@Transactional(readOnly = false, propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
public boolean checkLogin(User user) throws Exception {
System.out.println("UserSfds");
int result = userDao.addUser(user);
if (result > 0) {
throw new Exception("插入错误");//插入成功,抛出异常,千万不要捕捉
}
return false;
}

这样配置就可以成功了,网上有很多资料中事务是没有回滚的。


0 0
原创粉丝点击