Spring整合mybatis事务,事务怎么都不提交。我要疯了~~~

sinGel_t 2014-04-01 12:16:35
applicationContext.xml配置

<!-- 扫描注释组件 -->
<context:component-scan base-package="com.tl"/>
<!-- 隐式地向 Spring 容器注册-->
<context:annotation-config/>
<!-- 配置数据源 -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/bbs"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
<property name="maxActive" value="100"/>
<property name="maxIdle" value="30"/>
<property name="maxWait" value="500"/>
<!-- 如果数据源的defaultAutoCommit设置为True了,那么方法中如果自己捕获了异常,事务是不会回滚的,如果没有自己捕获异常则事务会回滚 -->
<property name="defaultAutoCommit" value="false"/>
</bean>

<!-- 配置mybatis sqlSession工厂 -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="mapperLocations" value="classpath*:com/tl/dao/*.xml"/>
</bean>

<!-- 事务管理 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>

<tx:advice id="txAdivce" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="add*" propagation="REQUIRED" rollback-for="SQLException"/>
<tx:method name="udpate*" propagation="REQUIRED" rollback-for="SQLException"/>
<tx:method name="insert*" propagation="REQUIRED" rollback-for="SQLException"/>
</tx:attributes>
</tx:advice>

<aop:config>
<aop:pointcut id="pointcut" expression="execution(* com.tl.serviceImpl.*.*(..))" />
<aop:advisor advice-ref="txAdivce" pointcut-ref="pointcut"/>
</aop:config>


单元测试里能用事务提交数据,但是在tomcat上进入aciont调用方法后始终是不能提交数据求大神帮助啊!!!
...全文
15262 13 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
wenjie4892543 2014-04-02
  • 打赏
  • 举报
回复
<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> 是配置 全局事务的
sinGel_t 2014-04-01
  • 打赏
  • 举报
回复
引用 7 楼 suciver 的回复:
楼主你aop切点表达式拦截的是com.tl.serviceImpl包下(不含子包的)所有类的方法,你的事务类是不是在这个子包下了


这样的,没问题把
sinGel_t 2014-04-01
  • 打赏
  • 举报
回复
引用 1 楼 fan578 的回复:
你先判断下你的单元测试是否真的提交事务了,在你的保存的地方,throw一个异常,看事务是否回滚。 action层不提交事务,你需要看下你事务隔离等级
我在junti里面自己抛出异常是要回滚的,不会提交。也能正常的提交数据,如果注释掉<tx:method name="add*" propagation="REQUIRED" rollback-for="SQLException"/>就不能提交数据,因为我设置的是默认不自动提交。 这说明我的事务起了作用的,但是在action里面就不一样了
sinGel_t 2014-04-01
  • 打赏
  • 举报
回复
我的service文件是在com.tl.serviceImpl下的UserService类, 然后在junit里面测试事务是可以提交的,正常录入到数据库。 但是启动tamcat后 在ation调用service的addUser方法 就怎么也不提交事务 没办法录入数据库。
只是_曾经 2014-04-01
  • 打赏
  • 举报
回复
看你的织入点写的对不对。把service包的层级贴一下
suciver 2014-04-01
  • 打赏
  • 举报
回复
楼主你aop切点表达式拦截的是com.tl.serviceImpl包下(不含子包的)所有类的方法,你的事务类是不是在这个子包下了
翘班党 2014-04-01
  • 打赏
  • 举报
回复
引用 4 楼 forgetsam 的回复:
[quote=引用 3 楼 WLLX623 的回复:]
<!-- 事务管理 --> 
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="sqlSessionFactory"/>
    </bean>
配置文件这样改下
你是来搞笑的吗。[/quote] 那你给我解释下怎么个搞笑法呗。让我也笑笑
forgetsam 2014-04-01
  • 打赏
  • 举报
回复
你换个只有“两阶段提交”的数据库看看,比如Oracle 你的Mysql的库有两种,你能搞清楚了再用它。
forgetsam 2014-04-01
  • 打赏
  • 举报
回复
引用 3 楼 WLLX623 的回复:
<!-- 事务管理 --> 
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="sqlSessionFactory"/>
    </bean>
配置文件这样改下
你是来搞笑的吗。
翘班党 2014-04-01
  • 打赏
  • 举报
回复
<!-- 事务管理 --> 
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="sqlSessionFactory"/>
    </bean>
配置文件这样改下
静山晚风 2014-04-01
  • 打赏
  • 举报
回复
貌似 代码中应该有个commit操作
  • 打赏
  • 举报
回复
你先判断下你的单元测试是否真的提交事务了,在你的保存的地方,throw一个异常,看事务是否回滚。 action层不提交事务,你需要看下你事务隔离等级
beiouwolf 2014-04-01
  • 打赏
  • 举报
回复
应该是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=false
public class DaoWrapService {
......
}

2.方法注解
public class DaoWrapService {
  @Transactional(readOnly=false)
  public void add(Object data) {
    .....
 }
}

67,550

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧