0 0

为何Spring + Ibatis 的事务不回滚?20

Spring ApplicationContext 配置文件:

<!-- 定义DataSource -->  
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">  
    <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver" />  
    <property name="url" value="jdbc:oracle:thin:@10.132.224.203:1521:myorcl" />  
    <property name="username" value="*****" />  
    <property name="password" value="*****" />  
</bean>  
  
<bean id="sqlmapclient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">  
    <property name="configLocation">  
        <value>classpath:com/test/ibatis/sqlmap/sqlMapConfig.xml</value>  
    </property>  
    <property name="dataSource" ref="dataSource" />  
</bean>  
  
<!-- Ibatis DAO 实现类 -->  
<bean id="iBatisDao" class="com.test.dao.impl.UserImpl">  
    <property name="sqlMapClient">  
        <ref local="sqlmapclient" />  
    </property>  
</bean>       
        
<!-- Struts Action类 注入业务类 -->  
<bean id="useraction" class="com.test.struts.action.UserAction">  
<property name="user" ref="user_service"></property>  
</bean>  
  
<!-- 业务类 注入dao实现类 -->  
<bean id="user_service" class="com.test.struts.service.UserService">  
    <property name="dao" ref="iBatisDao"></property>  
</bean>  
       
<!-- 事务管理 -->  
<bean id="transactionManage"  
     class="org.springframework.jdbc.datasource.DataSourceTransactionManager">  
         <property name="dataSource" ref="dataSource"></property>  
 </bean>  
  
<!-- 装配事务 -->  
<bean id="transactionInterceptor"  
 class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">  
    <property name="target" ref="user_service"></property>  
    <property name="transactionManager" ref="transactionManage"></property>  
    <property name="transactionAttributes">  
        <props>  
            <prop key="get*">PROPAGATION_REQUIRED,readOnly</prop>  
            <prop key="*">PROPAGATION_REQUIRED,-MyException,-RemoteException,-SocketException</prop>  
        </props>  
    </property>  
</bean>  

    <!-- 定义DataSource -->
    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver" />
        <property name="url" value="jdbc:oracle:thin:@10.132.224.203:1521:myorcl" />
        <property name="username" value="*****" />
        <property name="password" value="*****" />
    </bean>
    
    <bean id="sqlmapclient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
        <property name="configLocation">
            <value>classpath:com/test/ibatis/sqlmap/sqlMapConfig.xml</value>
        </property>
        <property name="dataSource" ref="dataSource" />
    </bean>

    <!-- Ibatis DAO 实现类 -->
    <bean id="iBatisDao" class="com.test.dao.impl.UserImpl">
        <property name="sqlMapClient">
            <ref local="sqlmapclient" />
        </property>
    </bean>    
         
    <!-- Struts Action类 注入业务类 -->
    <bean id="useraction" class="com.test.struts.action.UserAction">
    <property name="user" ref="user_service"></property>
    </bean>

    <!-- 业务类 注入dao实现类 -->
    <bean id="user_service" class="com.test.struts.service.UserService">
        <property name="dao" ref="iBatisDao"></property>
    </bean>
        
    <!-- 事务管理 -->
    <bean id="transactionManage"
         class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
             <property name="dataSource" ref="dataSource"></property>
     </bean>
    
    <!-- 装配事务 -->
    <bean id="transactionInterceptor"
     class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
        <property name="target" ref="user_service"></property>
        <property name="transactionManager" ref="transactionManage"></property>
        <property name="transactionAttributes">
            <props>
                <prop key="get*">PROPAGATION_REQUIRED,readOnly</prop>
                <prop key="*">PROPAGATION_REQUIRED,-MyException,-RemoteException,-SocketException</prop>
            </props>
        </property>
    </bean>


其中涉及的重要类:
UserImpl 数据层实现类:
public class UserImpl extends SqlMapClientDaoSupport implements IUserDao {   
  
    public void addUserInfo() {   
        UserModel umodel = new UserModel();   
        umodel.setId("4");   
        umodel.setName("lalala");   
        umodel.setPassword("123456789");   
        umodel.setState(1);   
        this.getSqlMapClientTemplate().insert(StaticSqlString.getADD_USER(), umodel);   
        //故意再插入一条数据导致错误   
        this.getSqlMapClientTemplate().insert(StaticSqlString.getADD_USER(), umodel);   
    }   
  
    public List getUserInfo() {   
        List list = null;   
        list = this.getSqlMapClientTemplate().queryForList(StaticSqlString.getSELECT_ALL_USER());   
        System.out.println(list.size());           
        return list;   
    }   
}  

public class UserImpl extends SqlMapClientDaoSupport implements IUserDao {

    public void addUserInfo() {
        UserModel umodel = new UserModel();
        umodel.setId("4");
        umodel.setName("lalala");
        umodel.setPassword("123456789");
        umodel.setState(1);
        this.getSqlMapClientTemplate().insert(StaticSqlString.getADD_USER(), umodel);
        //故意再插入一条数据导致错误
        this.getSqlMapClientTemplate().insert(StaticSqlString.getADD_USER(), umodel);
    }

    public List getUserInfo() {
        List list = null;
        list = this.getSqlMapClientTemplate().queryForList(StaticSqlString.getSELECT_ALL_USER());
        System.out.println(list.size());        
        return list;
    }
}


UserService 业务类(事务控制):
public List getUserInfo()   
{   
    List list = null;   
    list = dao.getUserInfo();   
    return list;   
}   
  
public void addUser()throws RuntimeException{   
    try{   
        dao.addUserInfo();   
    }catch(DataAccessException es){   
        System.out.println("错误了");   
                    //抛出自定义错误MyException,继承自RuntimeException   
        throw new MyException(es.toString());   
    }   
}  

    public List getUserInfo()
    {
        List list = null;
        list = dao.getUserInfo();
        return list;
    }
    
    public void addUser()throws RuntimeException{
        try{
            dao.addUserInfo();
        }catch(DataAccessException es){
            System.out.println("错误了");
                        //抛出自定义错误MyException,继承自RuntimeException
            throw new MyException(es.toString());
        }
    }


MyException:自定义错误类:
public class MyException extends RuntimeException{   
    public MyException(String msg){   
        super(msg);   
    }   
}  

public class MyException extends RuntimeException{
    public MyException(String msg){
        super(msg);
    }
}

UserAction 中调用业务类方法新增数据:
public String execute() throws Exception {   
    String type = request.getParameter("type").toString();   
    if(type.equals("1")){   
        List list = new ArrayList();   
        list = user.getUserInfo();   
        this.setUserlist(list);   
    }else{   
            user.addUser();   
    }   
    return "testok";   
}  

    public String execute() throws Exception {
        String type = request.getParameter("type").toString();
        if(type.equals("1")){
            List list = new ArrayList();
            list = user.getUserInfo();
            this.setUserlist(list);
        }else{
                user.addUser();
        }
        return "testok";
    }


但不知道为什么在Spring中装配的声明事务似乎同空气一般不起任何作用,不知道是哪里设置错误还是代码上出错了,我有些怀疑是事务控制层对应不上事务装配中指定的类,但又不是非常确定,还请大家帮忙看看是哪里的问题了?多谢多谢!!
2008年9月18日 20:10

6个答案 按时间排序 按投票排序

0 0

首先,你将事务管理的类定义到service层,这样它是管理不到dao层的,如果你想测试这个配置是否正确,应该在service层中声明异常。
其次,你的dao层也不能这样写,应该保证每个方法的原子性。

2008年9月19日 14:44
0 0

研究了下做个总结:
   你的事务绑定在service层,只有框架自己捕获向service抛的异常才能做回滚,你不应该自己去捕获,然后在service抛异常到上一层。

2008年9月19日 14:18
0 0

嘿嘿,事务应该在一个方法体内

2008年9月19日 14:11
0 0

“你定义的事务回滚是在service层,你在dao层抛出异常,他是不会回滚的”好像不太对吧,只要你service方法里面有调用dao中的方法,当dao方法抛异常时候,如果这个异常符合事务异常规则会被处理的。

2008年9月19日 07:36
0 0

<bean id="rantService"
	class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">

	<property name="target" ref="rantServiceTarget" />
	<property name="proxyInterfaces" value="com.roadrantz.service.RantService" />
	<property name="transactionManager" ref="transactionManager" />
	<property name="transactionAttributes">
		<props>
			<prop key="add*">PROPAGATION_REQUIRED</prop>
			<prop key="*">PROPAGATION_SUPPORTS,readOnly</prop>
		</props>
	</property>
</bean>

这个是spring in action 上的一个例子,对照你的配置好像是掉了个proxyInterfaces配置,你加上试试看是否是这个问题

2008年9月19日 07:33
0 0

你好,你定义的事务回滚是在service层,你在dao层抛出异常,他是不会回滚的,你可以尝试下。这个我还是测试过的。

2008年9月18日 22:07

相关推荐

    Spring+ibatis 保留ibatis事务的配置

    这种配置方式使得ibatis能够在不依赖Spring事务管理的情况下独立工作,从而实现了对ibatis事务的保留。 #### 四、实现自定义控制回滚 当保留ibatis事务后,开发者可以在业务逻辑中更自由地控制事务的提交和回滚。...

    struts2+spring+ibatis的小demo

    同时,Spring的事务管理确保了数据的一致性,比如在处理数据库操作时进行自动的回滚和提交。 **iBatis** 是一个持久层框架,它简化了SQL操作,将SQL语句与Java代码分离。在本demo中,iBatis可能会被用来执行员工...

    搭建spring mvc+spring+ibatis所需所有jar包

    3. **事务控制**:通常在Service层使用@Transactional注解进行事务控制,Spring会自动管理事务的开启、提交和回滚。 4. **异常处理**:在Controller层捕获并处理可能抛出的异常,确保正常响应。 这些jar包的集合...

    Spring + Ibatis 与mysql集群集成

    3. **Ibatis配置**:Ibatis的配置文件中,需要指定数据源为Spring管理的数据源,这样Ibatis就能通过Spring获取数据库连接。同时,定义SQL映射文件,编写对应的XML映射语句。 4. **事务管理**:由于MySQL集群支持...

    spring+ibatis声明式事务Demo_

    在IT行业中,Spring框架与iBatis(现为MyBatis)是两个广泛使用的开源工具,主要用于构建企业级Java应用程序。本示例“spring+ibatis声明式事务Demo”将探讨如何在Spring与iBatis集成环境中使用声明式事务管理。声明...

    spring+ibatis声明式事务Demo

    在IT行业中,Spring框架与iBatis(现为MyBatis)是两个广泛使用的开源工具。Spring是一个全面的Java企业级应用开发框架,而iBatis(MyBatis)则是一个优秀的持久层框架,它简化了数据库操作。当我们谈论"spring+...

    Spring+iBatis+JOTM实现JTA事务

    在集成Spring+iBatis+JOTM的环境中,Spring主要负责事务策略的配置和管理,iBatis则作为持久层框架,负责SQL的执行,而JOTM作为事务管理器,确保跨数据库的事务一致性。 1. **环境搭建** - 首先,确保安装了JDK ...

    ibatis 完美例子 一对多 批处理 事务 和 spring struts2集成

    这样,一旦发生异常,Spring会自动回滚事务,保证数据一致性。 最后,关于Spring与Struts2的集成。Spring作为应用框架,负责依赖注入和事务管理;Struts2则作为MVC框架,处理请求和视图。结合Ibatis,我们可以创建...

    spring+jotm+ibatis+mysql实现JTA分布式事务

    本项目“spring+jotm+ibatis+mysql实现JTA分布式事务”旨在利用这些技术来确保在分布式环境中的数据一致性。下面将详细介绍这个项目所涉及的知识点。 首先,Spring框架是Java开发中最常用的应用框架之一,它提供了...

    struts2+spring+ibatis学生管理demo

    同时,Spring的事务管理能力确保了对数据库操作的原子性和一致性,通过声明式事务管理,可以在XML配置文件中轻松设置事务边界,如开启、提交、回滚等操作。 Ibatis是轻量级的持久层框架,它简化了JDBC的繁琐工作,...

    Spring+iBatis配置[归类].pdf

    - 事务管理器(TransactionManager)配置,如`PlatformTransactionManager`,它与iBatis的数据源配置结合,控制事务的开始、提交和回滚。 - 数据源(DataSource)配置,定义如何连接到数据库。 - iBatis的...

    struts2+spring+ibatis框架搭建手册

    然后,Spring可以管理这些SqlSession,提供事务的开始、提交、回滚等操作。 5. **实际应用**:在项目中,开发者会创建具体的Action类,这些类通常会包含处理用户请求的方法,并通过注入的Service类调用业务逻辑。...

    spring+ibatis

    完成后,Spring会自动提交或回滚事务。 9. **最佳实践**: - 尽可能使用注解配置,以减少XML配置文件的复杂性。 - 使用Spring的AOP进行事务管理,使事务处理更透明。 - 为每个Mapper接口创建单独的配置,保持...

    spring+ibatis的jpetstore实例工程,包含完整源代码和jar包

    《Spring与iBatis结合的JPetStore实例详解》 在Java Web开发领域,Spring框架...通过学习这个实例,开发者不仅可以深入了解Spring和iBatis的用法,还能掌握MVC架构、事务管理等核心概念,为实际项目开发打下坚实基础。

    基于Spring+Ibatis的安全线程实现

    5. **事务管理**:Spring的PlatformTransactionManager接口用于管理事务,可以自动进行回滚和提交,确保数据一致性。在配置文件中,我们可以选择合适的事务管理器,如DataSourceTransactionManager或...

    Spring+Struts+ibatis下配置数据读写分离及事务(一)

    总结来说,Spring、Struts和iBATIS的集成能够为复杂的企业级应用提供强大的数据访问和事务控制能力。通过合理的设计和配置,我们可以实现数据读写分离,优化系统性能,同时确保事务的正确性和一致性。在这个过程中,...

    Spring+Struts+iBATIS整合

    Spring提供了声明式事务管理,只需在配置文件中设置事务边界,即可自动处理事务的提交和回滚,确保数据的一致性。 总的来说,Spring、Struts和iBATIS的整合能够为Java Web开发提供一个强大而灵活的架构。通过它们的...

    spring mvc+ibatis+spring注解

    Spring MVC 是一个基于Java的轻量级Web应用框架,它为构建模型-视图-控制器(MVC)架构的应用程序提供了强大的支持。在本项目中,Spring 2.5 版本被用作核心框架来处理请求和响应,提供依赖注入(DI)以及面向切面...

    Spring + iBATIS

    Spring 是一个全面的后端开发框架,提供依赖注入、面向切面编程、事务管理等功能,而 iBATIS 是一个优秀的数据持久层框架,它简化了数据库操作,将 SQL 查询与 Java 代码分离。 在 Spring 和 iBATIS 的整合中,主要...

Global site tag (gtag.js) - Google Analytics