`
dengjinxin
  • 浏览: 11237 次
最近访客 更多访客>>
社区版块
存档分类
最新评论

ibatis事务

阅读更多
基于JDBC 的事务管理机制
ibatis 提供了自动化的JDBC 事务管理机制。
对于传统JDBC Connection 而言,我们获取Connection 实例之后,需要调用Connection.setAutoCommit 设定事务提交模式。在AutoCommit 为true 的情况下,JDBC 会对我们的操作进行自动提交,此时,每个JDBC 操作都是一个独立的任务。为了实现整体事务的原子性,我们需要将AutoCommit 设为false ,并结合Connection.commit/rollback 方法进行事务的提交/回滚操作。


ibatis 的所谓“自动化的事务提交机制”,即ibatis 会根据当前的调用环境,自动判断操作是否需要自动提交。
如果代码没有显式的调用SqlMapClient.startTransaction() 方法,则ibatis会将当前的数据库操作视为自动提交模式(AutoCommit=true),如:
sqlMap = xmlBuilder.buildSqlMap(reader);
User user = new User();
user.setId(new Integer(1));
user.setName("Erica");
user.setSex(new Integer(0));
sqlMap.update("User.updateUser", user);
User user2 = new User();
user2.setId(new Integer(2));
user2.setName("Kevin");
user2.setSex(new Integer(1));
sqlMap.update("User.updateUser", user2);
在执行的时候,会自动判定运行环境,这里操作sqlMap.update ibatis 当前的update并没有相对应的事务范围(startTransaction 和endTransaction 代码块),于是ibatis 将其作为一个单独的事务,并自动提交。对于上面的代码,update 执行了两次,与其相对应,事务也提交了两次(即每个update 操作为一个单独的事务)。不过,值得注意的是,这里的所谓“自动判定”,可能有些误导,ibatis 并没有去检查当前是否已经有事务开启,从而判断当前数据库连接是否设定为自动提交。实际上,在执行update 语句时,sqlMap 会检查当前的Session 是否已经关联了某个数据库连接,如果没有,则取一个数据库连接,将其AutoCommit 属性设为true ,然后执行update 操作,执行完之后又将这个连接释放。这样,上面两次update 操作实际上先后获取了两个数据库连接,而不是我们通常所认为的两次update 操作都基于同一个JDBC Connection 。这点在开发时需特别注意。


对于多条SQL 组合而成的一个JDBC 事务操作而言,必须使用
startTransaction、commit 和endTransaction 操作以实现整体事务的原子性。

如:
try{
sqlMap = xmlBuilder.buildSqlMap(reader);
sqlMap.startTransaction();
User user = new User();
user.setId(new Integer(1));
user.setName("Erica");
user.setSex(new Integer(0));
sqlMap.update("User.updateUser", user);
User user2 = new User();
user2.setId(new Integer(2));
user2.setName("Kevin");
user2.setSex(new Integer(1));
sqlMap.update("User.updateUser", user2);
sqlMap.commitTransaction();
}finally{
sqlMap.endTransaction();
}
如果user1 或者user2 的update 操作失败,整个事务就会在endTransaction 时回滚,从而保证了两次update 操作的原子性。


基于JTA 的事务管理机制
JTA 提供了跨数据库连接(或其他JTA 资源)的事务管理能力。这一点是与JDBC Transaction 最大的差异。
JDBC 事务由Connnection 管理,也就是说,事务管理实际上是在JDBC Connection 中实现。事务周期限于Connection 的生命周期。同样,对于基于JDBC 的ibatis 事务管理机制而言,事务管理在SqlMapClient 所依托的JDBC Connection 中实现,事务周期限于SqlMapClient 的生命周期。
JTA 事务管理则由JTA 容器实现,JTA 容器对当前加入事务的众多Connection 进行调度,实现其事务性要求。JTA 的事务周期可横跨多个JDBC Connection 生命周期。


同样,对于基于JTA 事务的ibatis 而言,JTA 事务横跨可横跨多个SqlMapClient 。
下面这幅图形象的说明了这个问题:

为了在ibatis 中使用JTA 事务管理,我们需要在配置文件中加以设定:
<transactionManager type="JTA">
……
</transactionManager>
在实际开发中,我们可能需要面对分布式事务的处理,如系统范围内包含了多个数据库,
也许还引入了JMS 上的事务管理(这在EAI 系统实现中非常常见)。我们就需要引入JTA
以实现系统范围内的全局事务,如下面示例中,我们同时将user 对象更新到两个不同的数
据库:
User user = new User();
user.setId(new Integer(1));
user.setName("Erica");
user.setSex(new Integer(0));
sqlMap1 = xmlBuilder.buildSqlMap(db1Config);
sqlMap2 = xmlBuilder.buildSqlMap(db2Config);
try{
sqlMap1.startTransaction();
sqlMap1.update("User.updateUser", user);
sqlMap2.update("User.updateUser", user);
sqlMap1. commitTransaction();
}finally{
sqlMap1.endTransaction();
}
上面的代码中,两个针对不同数据库的实例,在同一个事务中SqlMapClient JTA
对user 对象所对应的数据库记录进行更新。外层的sqlMap1 启动了一个全局事务,此
事务将涵盖本线程内commitTransaction 之前的所有数据库操作。只要其间发生了

异常,则整个事务都将被回滚。
外部事务管理
基于JTA 的事务管理还有另外一个特殊情况,就是利用外部事务管理机制。
对于外部事务管理,我们需要在配置文件中进行如下设定:
<transactionManager type="EXTERNAL">
……
</transactionManager>
下面是一个外部事务管理的典型示例:
UserTransaction tx = new InitialContext().lookup(“……”);
……
sqlMap1 = xmlBuilder.buildSqlMap(db1Config);
sqlMap2 = xmlBuilder.buildSqlMap(db2Config);
sqlMap1.update("User.updateUser", user);
sqlMap2.update("User.updateUser", user);
……
tx.commit();
此时,我们借助实例启动了一个全局事务。之后的操作JTA UserTransaction ibatis
( sqlMap1.update 和sqlMap2.update)全部被包含在此全局事务之中,当
UserTransaction 提交的时候,
ibatis 操作被包含在事务中提交,反之,如果UserTransaction
回滚,那么其间的ibatis 操作也将作为事务的一部分被回滚。这样,我们就实现了ibatis
外部的事务控制。
另一种外部事务管理方式是借助EJB 容器,通过EJB 的部署配置,我们可以指定
EJB 方法的事务性
下面是一个Session Bean 的doUpdate 方法,它的事务属性被申明为“Required”,
EJB 容器将自动维护此方法执行过程中的事务:
/**
*
@ejb.interface-method
*
view-type="remote"
*
*
@ejb.transaction type = "Required"
**/
public void doUpdate(){
//EJB环境中,通过部署配置即可实现事务申明,而无需显式调用事务
……
sqlMap1 = xmlBuilder.buildSqlMap(db1Config);
sqlMap2 = xmlBuilder.buildSqlMap(db2Config);
sqlMap1.update("User.updateUser", user);
sqlMap2.update("User.updateUser", user);
……
}//方法结束时,如果没有异常发生,则事务由EJB容器自动提交。
上面的示例中,ibatis 数据操作的事务管理将全部委托给EJB 容器管理,由EJB
容器控制其事务调度。

在上面JTA 事务管理的例子中,为了保持清晰,我们省略了startTransaction 、
commitTransaction 和endTransaction 的编写,在这种情况下,调用ibatis
的事务管理方法并非必须,不过在实际开发时,请酌情添加startTransaction 、
commitTransaction 和endTransaction 语句,这样可以获得更好的性能(如果
省略了startTransaction 、commitTransaction 和endTransaction 语句,
ibatis 将为每个数据操作获取一个数据连接,就算引入了数据库连接池机制,这样的
无谓开销也应尽量避免,具体请参见JDBC 事务管理中的描述),并保持代码风格的统
一。
本人转自:http://www.cnblogs.com/CanWork/p/3364423.html
分享到:
评论

相关推荐

    Spring+ibatis 保留ibatis事务的配置

    根据提供的文件信息,本文将详细解析如何在Spring与ibatis框架整合时,通过特定配置来保留ibatis事务处理机制,并实现对事务的自定义控制。文章将围绕标题、描述及部分代码片段展开讨论。 ### Spring与ibatis整合...

    spring+ibatis事务的配置

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

    ibatis事务控制案例

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

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

    根据提供的文件信息,本文将详细解析Spring与iBatis整合时如何保留并使用iBatis事务管理机制,以及如何在应用程序中实现手动控制事务的方法。 ### Spring与iBatis整合 Spring框架是一个全面的企业级应用开发框架,...

    Ibatis 事务处理

    标题 "Ibatis 事务处理" 涉及到的是在Java Web开发中使用Ibatis框架进行数据访问时的事务管理。Ibatis是一个轻量级的持久层框架,它允许开发者将SQL语句直接写在XML配置文件或者Java注解中,从而提供了灵活的数据...

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

    本文将深入探讨如何利用Ibatis实现一对多关系、批处理、事务管理和与Spring及Struts2的集成。 首先,让我们来看一下“一对多”关系。在数据库设计中,一对多关系很常见,比如一个用户可以有多个订单。在Ibatis中,...

    spring+ibatis声明式事务Demo

    当我们谈论"spring+ibatis声明式事务Demo"时,我们关注的是如何在Spring框架中利用iBatis实现声明式事务管理。 声明式事务管理是Spring框架提供的一种方便、高效的方式,使得开发者无需手动控制事务的开始、提交、...

    ibatis

    - 事务配置问题(如`spring&ibatis事务配置问题.htm`):整合过程中常见的问题可能涉及到事务的隔离级别、事务超时、回滚规则等,需要正确配置Spring的事务管理器以确保事务正确运行。 3. 文件编码转换: - 在...

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

    本文将深入探讨如何在Spring、Struts和iBATIS这三大流行框架的集成环境中实现数据读写分离以及事务控制。我们将不涉及具体的代码实现,而是侧重于理论背景和设计原则。 首先,让我们理解数据读写分离的概念。数据...

    springmvc+ibatis框架包,使用spring注入,事务等,包都齐全

    自己配置的springmvc+ibatis框架,自己找齐了包,不容易啊,所以上来跟大家分享一下,spring自动注入包,事务包,ibatis包,数据库连接包,都齐全的,仅局限于springmvc+ibatis,这些包不多,不少,刚够

    ibatis培训教程

    - **iBATIS事务管理**: - 支持JDBC事务管理,适用于简单的应用程序。 - 如果在应用服务器环境中,可以选择MANAGED事务管理,由应用服务器负责事务的开始、提交或回滚。 - **事务隔离级别**: - iBATIS允许配置不同...

    spring+ibatis声明式事务Demo_

    本示例“spring+ibatis声明式事务Demo”将探讨如何在Spring与iBatis集成环境中使用声明式事务管理。声明式事务管理允许开发者通过配置来控制事务,无需在代码中显式处理事务开始、提交和回滚。 **Spring框架** 是一...

    DB事务详解

    事务的实现可以通过多种方式实现,如JDBC事务、JTA事务、IBATIS事务支持等。 4.1、JDBC事务 JDBC事务是Java数据库连接(JDBC)提供的一种事务机制。JDBC事务可以通过 Connection 对象的 setAutoCommit() 方法来...

    ibatis技术总结

    iBatis事务处理 iBatis提供了两种事务管理方式:JDBC事务管理和MANAGED事务管理。默认情况下,iBatis使用JDBC事务管理。开发者可以通过配置`&lt;transactionManager&gt;`元素来选择合适的事务管理策略,并确保事务的一致...

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

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

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

    以下是关于"spring ibatis 配置(包括事务管理)"的详细说明: 1. **引入依赖**:首先,我们需要在项目中添加Spring和iBatis的相关依赖。通常,这会在Maven或Gradle的配置文件中完成,确保引入了正确的版本。 2. *...

    ibatis+jndi+mysql

    Ibatis 提供了事务控制功能,可以自动提交或回滚事务。例如,对于更新操作,可以在服务层代码中设置事务边界,如果操作成功则自动提交,否则回滚。 **Ibatis 与 JNDI 结合** JNDI(Java Naming and Directory ...

    ibatis学习资料

    - **iBATIS事务的划分** - **主动事务**:开发者通过代码控制事务的开始、提交和回滚。 - **被动事务**:iBATIS框架内部管理事务。 - **事务的使用**:在使用iBATIS时,可以通过SqlSession对象开启、提交或回滚...

Global site tag (gtag.js) - Google Analytics