`
sd_zyl
  • 浏览: 44292 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

spring ibatis事务一个误区分析

 
阅读更多
先看段经典的ibatis spring配置,注意我的配置中没有配置spring的声明式事务:
         <!-- ======================================================================== -->
         <!-- DataSource定义。 -->
         <!-- ======================================================================== -->
         <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
                   destroy-method="close">
                   <property name="driverClassName" value="**" />
                   <property name="url" value="**" />
                   <property name="username" value="**" />
                   <property name="password" value="**" />
                   <property name="defaultAutoCommit" value="true or false" /> <!---请先不关心这个配置,后面会说道--
         </bean>

         <!-- ======================================================================== -->
         <!-- TransactionManager定义。 -->
         <!-- ======================================================================== -->
         <bean id="transactionManager"
                   class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
                   <property name="dataSource" ref="dataSource" />
         </bean>
         <bean id="transactionTemplate"
                   class="org.springframework.transaction.support.TransactionTemplate">
                   <property name="transactionManager" ref="transactionManager" />
         </bean>

         <!-- ======================================================================== -->
         <!-- iBatis SQL map定义。 -->
         <!-- ======================================================================== -->
         <bean id="sqlMapClient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
                   <property name="dataSource" ref="dataSource" />
                   <property name="configLocation" value="classpath:META-INF/sqlmap/sqlmap-config.xml" />
         </bean>   
        
面对上面的配置,看下面的代码有什么问题:
                   try {
                            sqlMapClient.startTransaction();
                            //...do something
                            sqlMapClient.commitTransaction();
                   }
                   catch(Exception e) {
                            try {
                                     client.endTransaction();
                            } catch (Exception ex) {
                                     
                            }
                   }    
            
表面上没有问题,错!问题很大~~~看下面SqlMapClientFactoryBean源代码
import com.ibatis.sqlmap.engine.transaction.external.ExternalTransactionConfig;
public class SqlMapClientFactoryBean implements FactoryBean<SqlMapClient>, InitializingBean {
         //...省略其它
         private Class transactionConfigClass = ExternalTransactionConfig.class;
         
         public void afterPropertiesSet() throws Exception {
         //...
                   try {
                            //读取配置的ibatis映射
                            this.sqlMapClient = ...;

                            if (this.dataSource != null) {
                                     //这个地方关键的很,实例化了ExternalTransactionConfig,事务的提交取决这里。这里实际实例化的是ExternalTransactionConfig对象,而这个对象的内容,请看下面
                                     TransactionConfig transactionConfig = (TransactionConfig) this.transactionConfigClass.newInstance();
                                     DataSource dataSourceToUse = this.dataSource;
                                     if (this.useTransactionAwareDataSource && !(this.dataSource instanceof TransactionAwareDataSourceProxy)) {
                                               dataSourceToUse = new TransactionAwareDataSourceProxy(this.dataSource);
                                     }
                                     transactionConfig.setDataSource(dataSourceToUse);
                                     transactionConfig.initialize(this.transactionConfigProperties);
                                     //将事务配置应用到sqlMapClient
                                     applyTransactionConfig(this.sqlMapClient, transactionConfig);
                            }
                   }
                  //....
         }
}

再看下ExternalTransactionConfig代码:
public class ExternalTransactionConfig extends BaseTransactionConfig {

  private boolean defaultAutoCommit = false;
  private boolean setAutoCommitAllowed = true;
  //这里是spring启动事务调用的方法
  public Transaction newTransaction(int transactionIsolation) throws SQLException, TransactionException {
    return new ExternalTransaction(dataSource, defaultAutoCommit, setAutoCommitAllowed, transactionIsolation);
  }
  //...省略
}

再看ExternalTransaction:
public class ExternalTransaction implements Transaction {
  //...其它省略
  //ibatis默认使用外部事务提交的时候是空实现!回滚也是。
  public void commit() throws SQLException, TransactionException {
  }

  public void rollback() throws SQLException, TransactionException {
  }
}

到此真相大白,事务没有任何作用~~
也就是说如果使用spring集成管理ibatis,ibatis的事务将完全交由外部spring进行管理,ibatis不作为!

为什么有时候似乎数据库里面也插入了数据?哦,请看下面的属性配置:
<property name="defaultAutoCommit" value="true or false" />

这个属性的配置起了关键作用,如果配置为true,会自行提交,这也就不难解释为什么有数据了,而一旦配置成false,数据却一条也没有了~•~•
分享到:
评论

相关推荐

    spring+ibatis事务的配置

    很好的spring+ibatis事务的配置文档.

    Spring+ibatis 保留ibatis事务的配置

    Spring 是一个轻量级的Java应用开发框架,提供了依赖注入、面向切面编程等功能,而ibatis则是一个基于Java的持久层框架,它提供了一种简单的方式来执行SQL语句并映射结果到Java对象上。当这两个框架结合起来时,可以...

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

    在IT行业中,数据库操作是应用开发的核心部分,而Ibatis作为一个优秀的持久层框架,提供了灵活的SQL映射机制,使得数据库操作更为简单高效。本文将深入探讨如何利用Ibatis实现一对多关系、批处理、事务管理和与...

    SPRING IBATIS 保留IBATIS事务的配置方式

    接下来配置了iBatis的SqlMapClient,这里使用的是Spring的`SqlMapClientFactoryBean`来创建一个SqlMapClient实例。 ```xml &lt;bean id="sqlMapClient" class="org.springframework.orm.ibatis....

    spring+ibatis声明式事务Demo_

    **Spring框架** 是一个全面的Java应用开发框架,它提供依赖注入(DI)、面向切面编程(AOP)以及各种企业服务,如事务管理。Spring的核心是IoC容器,它负责创建对象、管理对象间的依赖关系,并通过AOP支持实现横切...

    spring ibatis 配置(包括事务管理)

    Spring作为一个强大的IoC(Inversion of Control)和AOP(Aspect Oriented Programming)容器,可以方便地管理和协调iBatis的数据访问组件。以下是关于"spring ibatis 配置(包括事务管理)"的详细说明: 1. **引入...

    spring ibatis整合所需jar包

    Spring是一个全面的后端开发框架,提供了依赖注入、AOP(面向切面编程)、事务管理等特性,而iBatis则是一个优秀的持久层框架,它将SQL语句与Java代码分离,使得数据库操作更加灵活和易于维护。将两者整合可以实现松...

    spring+ibatis声明式事务Demo

    Spring是一个全面的Java企业级应用开发框架,而iBatis(MyBatis)则是一个优秀的持久层框架,它简化了数据库操作。当我们谈论"spring+ibatis声明式事务Demo"时,我们关注的是如何在Spring框架中利用iBatis实现声明式...

    Spring与iBATIS的集成

    最后,还讨论了iBATIS的优缺点,及为什么是这样的一种方式,即所谓的“在完全OR与JDBC之间的一个幽雅的折衷。” &lt;br&gt;就象Developer's Notebook 系列中所有的书一样,你将由直接的且实用的方式获得信息,这些信息...

    struts2 spring ibatis 项目整合源码

    iBatis是一个SQL映射框架,它将SQL语句与Java代码分离,提供了更灵活的数据库操作方式。iBatis允许开发者直接编写SQL语句,避免了ORM框架可能带来的性能损失。在Spring和Struts2的整合项目中,iBatis作为数据访问层...

    Struts2+Spring+iBATIS架构实现

    Struts2 Spring iBATIS 架构 实现 Struts2 Spring iBATIS 架构 实现 Struts2 Spring iBATIS 架构 实现 Struts2 Spring iBATIS 架构 实现

    ibatis事务控制案例

    本案例聚焦于`ibatis`(MyBatis前身)的事务管理,它是一个轻量级的Java持久层框架,提供了灵活的SQL映射功能。在Java应用中,Ibatis与SQL Server、MySQL等数据库配合,可以实现高效的数据库访问和事务处理。 **1. ...

    spring与ibatis整合集成实例

    Spring 是一个全面的后端开发框架,提供依赖注入、面向切面编程、事务管理等功能;而 iBATIS 是一个持久层框架,它简化了数据库操作,将 SQL 语句与 Java 代码分离,提供了灵活的数据访问接口。 在整合 Spring 和 ...

    Struts2+Spring+Hibernate和Struts2+Spring+Ibatis

    这两种框架结合Spring,旨在提供一个强大的、可扩展的、易于维护的后端架构。 首先,让我们详细了解一下每个组件: 1. **Struts2**:这是一个MVC(Model-View-Controller)框架,负责处理用户请求并将其映射到相应...

    struts+spring+ibatis框架集合教程

    Struts、Spring和iBatis是Java开发中常用的三大开源框架,它们各自专注于应用程序的不同层次:Struts处理表现层逻辑,Spring提供全面的依赖注入和事务管理,而iBatis则负责数据访问层的工作。本教程集合了这三者的...

    Spring 2.5整合iBATIS 2.3并使用Spring的声明式事务管理

    总的来说,Spring 2.5整合iBATIS 2.3是一个常见的Java应用架构模式,它允许我们在不牺牲灵活性和控制力的情况下,享受Spring提供的高级特性,如依赖注入和事务管理。这种模式广泛应用于各种复杂的企业级应用中,对于...

    Spring ibatis dwr2 extjs 实例1

    本例子通过Spring容器管理ibatis dwr2的javaBean以及事务,Extjs通过dwr2来调用Spring管理类

Global site tag (gtag.js) - Google Analytics