Spring整合mybatis事务,事务怎么都不提交。我要疯了~~~ 本帖最后由 sdhahjaj 于 2014-04-01 00:19:50 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 你先判断下你的单元测试是否真的提交事务了,在你的保存的地方,throw一个异常,看事务是否回滚。action层不提交事务,你需要看下你事务隔离等级 貌似 代码中应该有个commit操作 <!-- 事务管理 --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="sqlSessionFactory"/> </bean>配置文件这样改下 你换个只有“两阶段提交”的数据库看看,比如Oracle你的Mysql的库有两种,你能搞清楚了再用它。 楼主你aop切点表达式拦截的是com.tl.serviceImpl包下(不含子包的)所有类的方法,你的事务类是不是在这个子包下了 看你的织入点写的对不对。把service包的层级贴一下 我的service文件是在com.tl.serviceImpl下的UserService类,然后在junit里面测试事务是可以提交的,正常录入到数据库。但是启动tamcat后 在ation调用service的addUser方法 就怎么也不提交事务 没办法录入数据库。 我在junti里面自己抛出异常是要回滚的,不会提交。也能正常的提交数据,如果注释掉<tx:method name="add*" propagation="REQUIRED" rollback-for="SQLException"/>就不能提交数据,因为我设置的是默认不自动提交。这说明我的事务起了作用的,但是在action里面就不一样了 应该是aop织入点的问题还有就是spring mvc的容器加载中,spring的包加载和web部分的包加载是处于两个明名空间的假设你的这个类加载是在applicationContext.xml 是用ContextLoaderListener加载的aop织入是在mvc的DispatcherServlet加载的那么aop就不能正确的匹配到切入点先确定类所在明名空间和aop是在同一空间下然后,对于事务管理器,建议采用自动配置,而不是aop切入事务管理器的配置示例:<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager" p:dataSource-ref="dataSource" p:defaultTimeout="40"> </bean> <tx:annotation-driven transaction-manager="transactionManager" />对于需要启用的service类,可以在类级别或者方法级别上用@Transactional注解1.类注解@Service@Transactional(readOnly=false) // 只读事务 readOnly=true 读写事务 readOnly=falsepublic class DaoWrapService {......}2.方法注解public class DaoWrapService { @Transactional(readOnly=false) public void add(Object data) { ..... }} <aop:pointcut id="pointcut" expression="execution(* com.tl.serviceImpl.*.*(..))" /> 你这里的事务应该是作用在service 这一层 所以 你的 注释应该 写在 service 层<!-- 事务管理 --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="sqlSessionFactory"/> </bean> 是配置 全局事务的 关于客户端关闭,服务器继续执行的问题 Java代码格式讨论 有没有做过根据XML测试数据文件自动生成测试脚本 急,对log4j源代码进行修改,如何编译打包? 启动JBOSS时 控制台 出异常???? xdjm们帮忙,关于数据库保密! jsp 和tomcat配置问题 j2ee不能启动 西安的朋友请进来!!!进者有分!让你了解现状!!! =====javax.servlet.jsp.JspException: Cannot find bean,常见的错误,不常见的场景。急求解决===== 大神求救。。。一个hibernate查询结果的问题。 JasperReports Server是干嘛的
action层不提交事务,你需要看下你事务隔离等级
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="sqlSessionFactory"/>
</bean>
配置文件这样改下
然后在junit里面测试事务是可以提交的,正常录入到数据库。
但是启动tamcat后 在ation调用service的addUser方法 就怎么也不提交事务 没办法录入数据库。
我在junti里面自己抛出异常是要回滚的,不会提交。也能正常的提交数据,如果注释掉<tx:method name="add*" propagation="REQUIRED" rollback-for="SQLException"/>就不能提交数据,因为我设置的是默认不自动提交。
这说明我的事务起了作用的,但是在action里面就不一样了
还有就是spring mvc的容器加载中,spring的包加载和web部分的包加载是处于两个明名空间的
假设你的这个类加载是在applicationContext.xml 是用ContextLoaderListener加载的
aop织入是在mvc的DispatcherServlet加载的
那么aop就不能正确的匹配到切入点先确定类所在明名空间和aop是在同一空间下
然后,对于事务管理器,建议采用自动配置,而不是aop切入
事务管理器的配置示例:<bean
id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager"
p:dataSource-ref="dataSource"
p:defaultTimeout="40">
</bean> <tx:annotation-driven transaction-manager="transactionManager" />对于需要启用的service类,可以在类级别或者方法级别上用@Transactional注解1.类注解
@Service
@Transactional(readOnly=false) // 只读事务 readOnly=true 读写事务 readOnly=false
public class DaoWrapService {
......
}2.方法注解
public class DaoWrapService {
@Transactional(readOnly=false)
public void add(Object data) {
.....
}
}
<!-- 事务管理 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="sqlSessionFactory"/>
</bean> 是配置 全局事务的