spring,ibatis整合后的事务问题

 

spring,ibatis整合后的事务问题

 

SPRING事务不回滚的问题,我进行了两次插入数据库的操作,第二次故意给一个非空字段插入null,但第一条记录还是成功插入了,一个星期了,没搞定,求指教。其中数据库已经设置为autocommit为false
框架及版本:
struts2 -2.0.1.4 , spring -2.5 ,ibatis 2.3,mysql 5.0

aplicationContext.xml:

Xml代码   收藏代码
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2.   
  3. <beans xmlns="http://www.springframework.org/schema/beans"  
  4.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"  
  5.     xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"  
  6.     xsi:schemaLocation="http://www.springframework.org/schema/beans     
  7.            http://www.springframework.org/schema/beans/spring-beans-2.5.xsd     
  8.            http://www.springframework.org/schema/context     
  9.            http://www.springframework.org/schema/context/spring-context-2.5.xsd     
  10.            http://www.springframework.org/schema/aop  
  11.            http://www.springframework.org/schema/aop/spring-aop-2.5.xsd     
  12.            http://www.springframework.org/schema/tx  
  13.            http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">  
  14.   
  15.     <bean id="dao" class="last.soul.dao.DAOImpl">  
  16.         <property name="sqlMapClient" ref="sqlMapClient"></property>  
  17.     </bean>  
  18.   
  19.     <bean id="userService" class="last.soul.service.UserServiceImpl">  
  20.         <property name="dao" ref="dao"></property>  
  21.     </bean>  
  22.     <bean id="login" class="last.soul.action.LoginAction">  
  23.         <property name="userService" ref="userService"></property>  
  24.     </bean>  
  25.   
  26.     <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"  
  27.         destroy-method="close">  
  28.         <property name="driverClassName" value="com.mysql.jdbc.Driver" />  
  29.         <property name="url" value="jdbc:mysql://localhost:3306/test" />  
  30.         <property name="username" value="root" />  
  31.         <property name="password" value="root" />  
  32.     </bean>  
  33.   
  34.     <bean id="sqlMapClient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">  
  35.         <property name="configLocation" value="WEB-INF/sqlMapConfig.xml" />  
  36.         <property name="dataSource" ref="dataSource" />  
  37.     </bean>  
  38.     <bean id="transactionManager"  
  39.         class="org.springframework.jdbc.datasource.DataSourceTransactionManager">  
  40.         <property name="dataSource">  
  41.             <ref bean="dataSource" />  
  42.         </property>  
  43.     </bean>  
  44.     <!--  
  45.         利用spring的TransactionProxyFactoryBean去对事务进行自动管理 <bean id="daoTr"  
  46.         class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">  
  47.         <property name="transactionManager"> <ref local="transactionManager"  
  48.         /> </property> <property name="target"> <list><ref local="userService"  
  49.         /></list> </property> <property name="transactionAttributes"> <props>  
  50.         <prop key="*">PROPAGATION_REQUIRED,-Exception</prop> </props>  
  51.         </property> </bean>  
  52.     -->  
  53.     <tx:advice id="txAdvice" transaction-manager="transactionManager">  
  54.         <!-- 哪些方法有 事务的传播性-->  
  55.         <tx:attributes>  
  56.             <tx:method name="*" isolation="READ_COMMITTED" propagation="REQUIRED" rollback-for="java.lang.Exception"/>  
  57.         </tx:attributes>  
  58.   
  59.     </tx:advice>  
  60.   
  61.     <!-- 哪些类的方法参与了事务 -->  
  62.     <aop:config>  
  63.         <!-- execution(* com.east.spring.managerimpl.*.*(..))这个类的所有方法都用事务 -->  
  64.         <aop:pointcut id="allManagerMethod"  
  65.             expression="execution(* last.soul.service.UserServiceImpl.*.*(..))" />  
  66.         <!-- 引用 pointcut 和 advice-->  
  67.         <aop:advisor pointcut-ref="allManagerMethod" advice-ref="txAdvice" />  
  68.     </aop:config>  
  69.   
  70.   
  71. </beans>  

UserServiceImpl:

package last.soul.service;

import last.soul.common.beans.User;
import last.soul.dao.DAO;

public class UserServiceImpl implements UserService {

    DAO dao;

    public boolean login(String username, String password) throws Exception {
        User u1=new User();
        u1.setEmail("d@163.com");
        u1.setPassword("ccc");
        u1.setUsername("aaaa");
        dao.insert("user.insert", u1);
       
        User u2=new User();
        u2.setEmail("d@163.com");
        u2.setPassword("he");
        u2.setUsername(null);
        dao.insert("user.insert", u2);
       
        return true;
    }
   
    public DAO getDao() {
        return dao;
    }

    public void setDao(DAO dao) {
        this.dao = dao;
    }

    public boolean isExist(String username) {
        return false;
    }

    public Integer register(User record) {
        return null;
    }
}

DAOImpl:

package last.soul.dao;

import java.sql.SQLException;

import org.springframework.orm.ibatis.support.SqlMapClientDaoSupport;

public class DAOImpl  extends SqlMapClientDaoSupport implements DAO{
    @SuppressWarnings("unchecked")
     public void insert(String sql,Object map) throws SQLException
    {
            this.getSqlMapClientTemplate().insert(sql, map);
    }

}



问题补充:
liwenjie 写道
spring默认进行回滚的异常是uncheckedException,而lz的SQLException 是checkedexception,无法进行回滚所以需要进行声明

<tx:advice id="txAdvice" transaction-manager="txManager">

  <tx:attributes>

         <tx:method name="get*" read-only="false" />

         <tx:method name="*" rollback-for="SQLException"/>

  </tx:attributes>

</tx:advice>



详情请参见 spring参考手册 回滚

我配的Exception不也一样而且我就是配置上了SQLException也是不回滚。
后来我又用了另外一个方法就是让他抛出我自己的异常,我让我自己的这个异常继承RuntimeException也是不回滚啊
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值