先看段经典的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 是一个轻量级的Java应用开发框架,提供了依赖注入、面向切面编程等功能,而ibatis则是一个基于Java的持久层框架,它提供了一种简单的方式来执行SQL语句并映射结果到Java对象上。当这两个框架结合起来时,可以...
在IT行业中,数据库操作是应用开发的核心部分,而Ibatis作为一个优秀的持久层框架,提供了灵活的SQL映射机制,使得数据库操作更为简单高效。本文将深入探讨如何利用Ibatis实现一对多关系、批处理、事务管理和与...
接下来配置了iBatis的SqlMapClient,这里使用的是Spring的`SqlMapClientFactoryBean`来创建一个SqlMapClient实例。 ```xml <bean id="sqlMapClient" class="org.springframework.orm.ibatis....
**Spring框架** 是一个全面的Java应用开发框架,它提供依赖注入(DI)、面向切面编程(AOP)以及各种企业服务,如事务管理。Spring的核心是IoC容器,它负责创建对象、管理对象间的依赖关系,并通过AOP支持实现横切...
Spring作为一个强大的IoC(Inversion of Control)和AOP(Aspect Oriented Programming)容器,可以方便地管理和协调iBatis的数据访问组件。以下是关于"spring ibatis 配置(包括事务管理)"的详细说明: 1. **引入...
Spring是一个全面的后端开发框架,提供了依赖注入、AOP(面向切面编程)、事务管理等特性,而iBatis则是一个优秀的持久层框架,它将SQL语句与Java代码分离,使得数据库操作更加灵活和易于维护。将两者整合可以实现松...
Spring是一个全面的Java企业级应用开发框架,而iBatis(MyBatis)则是一个优秀的持久层框架,它简化了数据库操作。当我们谈论"spring+ibatis声明式事务Demo"时,我们关注的是如何在Spring框架中利用iBatis实现声明式...
最后,还讨论了iBATIS的优缺点,及为什么是这样的一种方式,即所谓的“在完全OR与JDBC之间的一个幽雅的折衷。” <br>就象Developer's Notebook 系列中所有的书一样,你将由直接的且实用的方式获得信息,这些信息...
iBatis是一个SQL映射框架,它将SQL语句与Java代码分离,提供了更灵活的数据库操作方式。iBatis允许开发者直接编写SQL语句,避免了ORM框架可能带来的性能损失。在Spring和Struts2的整合项目中,iBatis作为数据访问层...
Struts2 Spring iBATIS 架构 实现 Struts2 Spring iBATIS 架构 实现 Struts2 Spring iBATIS 架构 实现 Struts2 Spring iBATIS 架构 实现
本案例聚焦于`ibatis`(MyBatis前身)的事务管理,它是一个轻量级的Java持久层框架,提供了灵活的SQL映射功能。在Java应用中,Ibatis与SQL Server、MySQL等数据库配合,可以实现高效的数据库访问和事务处理。 **1. ...
Spring 是一个全面的后端开发框架,提供依赖注入、面向切面编程、事务管理等功能;而 iBATIS 是一个持久层框架,它简化了数据库操作,将 SQL 语句与 Java 代码分离,提供了灵活的数据访问接口。 在整合 Spring 和 ...
这两种框架结合Spring,旨在提供一个强大的、可扩展的、易于维护的后端架构。 首先,让我们详细了解一下每个组件: 1. **Struts2**:这是一个MVC(Model-View-Controller)框架,负责处理用户请求并将其映射到相应...
Struts、Spring和iBatis是Java开发中常用的三大开源框架,它们各自专注于应用程序的不同层次:Struts处理表现层逻辑,Spring提供全面的依赖注入和事务管理,而iBatis则负责数据访问层的工作。本教程集合了这三者的...
总的来说,Spring 2.5整合iBATIS 2.3是一个常见的Java应用架构模式,它允许我们在不牺牲灵活性和控制力的情况下,享受Spring提供的高级特性,如依赖注入和事务管理。这种模式广泛应用于各种复杂的企业级应用中,对于...
本例子通过Spring容器管理ibatis dwr2的javaBean以及事务,Extjs通过dwr2来调用Spring管理类