`
xiebh
  • 浏览: 605614 次
  • 性别: Icon_minigender_1
  • 来自: 太原
社区版块
存档分类
最新评论

iBatis 的事务处理

阅读更多
我们在使用Dao时,如以下代码,先插入新记录,再进行更新:

 personDao.insertPerson (person); // Starts transaction
 person.setLastName("Begin");
 personDao.updatePerson (person); // Starts a new transaction

因为没有显式地启动事务,iBatis会认为这是两次事务,分别从连接池中取两次Connection。
我们所写的Dao子类(继承自com.ibatis.dao.client.template.SqlMapDaoTemplate)的每一个Dao方法已经默认为一个事务(通过动态代理)。

而在业务层,应该有一个类来统管Dao子类的事务,iBatis是通过DaoManager类来作这件事的,如下:

DaoManager provides access to all DAOs it manages and also allows transactions to be committed and ended (possibly rolled back)

众Dao子类由DaoManager产生,如:

 
DaoManager daoManager = DaoManagerBuilder.buildDaoManager(reader);
  UserDao userDao = (UserDao) daoManager.getDao(UserDao.class);
 

UserDao是用户自己定义的接口,获得的其实是在dao.xml中指定的相对应的 SqlMapDao实现类,从而实现了松藕合。在良好的分层设计中,业务层(service包)只需要知道Dao接口,而不去关心其具体怎么实现。如果显式地声明事务处理语句,如下:
 
try {
    daoManager.startTransaction();
    personDao.insertPerson (person);
    person.setLastName("Begin");
    personDao.updatePerson(person);    
    otherDao.doSomething(other);
    ...
    daoManager.commitTransaction();
  } finally {
    daoManager.endTransaction();
  }


  这样就保持了原子性,整体为一个事务,要么全部执行成功,否则回滚。
  现在唯一的问题就是,dao层的事务是否已经放弃,否则产生事务嵌套问题对性能会有影响(杞人忧天?)

  当然,iBatis 完全可以这么做:建一个声明式接口:IService,再使用动态代理,将用户自己的Serivce子类通过动态代理自动包上事务处理的代码,默认每一个业务方法为一个事务。
  大师的心如果能轻易揣测,就是不大师了:),估计大师认为这样属于过度设计,他认为把这种灵活性交给用户是合适的,相当多的service 方法只调用一个Dao方法,例如CRUD操作。

  再补充一下,iBatis中对事务的处理是可配置的,最常用的Type是"JDBC",也可以声明为"JTA"或"EXTERNAL".
分享到:
评论

相关推荐

    Ibatis 事务处理

    NULL 博文链接:https://kevin-zhang1983.iteye.com/blog/1111689

    如何处理Spring、Ibatis结合MySQL数据库使用时的事务操作Demo

    本工程以“银行账号转账”为例子演示了如何处理Spring、Ibatis结合MySQL数据库使用时的事务操作 本工程编码方式:UTF-8 须执行的SQL语句: CREATE DATABASE `test`; USE `test`; CREATE TABLE `lm_bank_card` ( `...

    如何处理Ibatis结合MySQL数据库使用时的事务操作Demo

    本工程以“银行账号转账”为例子演示了 如何处理Ibatis结合MySQL数据库使用时的事务操作 本工程编码方式:UTF-8 须执行的SQL语句: CREATE DATABASE `test`; USE `test`; CREATE TABLE `lm_bank_card` ( `id` ...

    iBATIS实战

    本书是讲述iBATIS框架的权威著作。书中既详实地介绍了iBATIS的设计理念和基础知识,也讨论了动态SQL、高速缓存、DAD框架等高级主题,还讲解了iBATIS在实际开发中的应用。书的最后给出了一个设计优雅、层次清晰的示例...

    iBatis SQL Maps开发指南.pdf

    自动的事务处理 全局(分布式)事务 批处理 用SqlMapClient执行SQL语句 代码例子 例子1:执行update(insert,update,delete) 例子2:查询成对象(select) 例子3:用预赋值的结果对象查询成对象(select) 例子4...

    ibatis SQL Map PPt

    Ibatis SQL Map 动态SQL 事务处理 缓存机制

    struts2+spring+ibatis学生管理demo

    struts2整合spring、ibatis学生信息管理系统。事务管理、分页处理

    Struts2.0+Springframework2.5+ibatis2.3完美整合用户登录及增删改查

    2006年5月,BEA系统宣布了他们在一个名为Pitchfork的项目上与Interface21的合作,该项目提供了基于Spring的Java EE 5编程模型的实现,包括支持用于注入(injection)、拦截( interception)和事务处理...

    ibatis 开发指南(pdf)

    系统数据处理量巨大,性能要求极为苛刻,这往往意味着我们必须通过经过高 度优化的SQL 语句(或存储过程)才能达到系统性能设计指标。 面对这样的需求,再次举起Hibernate 大刀,却发现刀锋不再锐利,甚至...

    springmvc-ibatis

    -- 配置那个类那个方法用到事务处理 --> *" read-only="true"/> *" propagation="REQUIRED"/> *" propagation="REQUIRED"/> *" propagation="REQUIRED"/> *" propagation="REQUIRED"/> ...

    heng-dao:封装轻量级ibatis

    heng-dao 满足公司业务分表业务,轻量级封装ibatis, 封装轻量级ibatis author barney.wang email: 1.支持ibatis分库事务 2.支持ibatis分表处理 3.复写sqlSessionTemplate

    J2EE核心:iBatis_DAO入门与进阶.doc

    对于这类问题更好的解决方法是建立一个ContactDAO接口,在这个接口中定义处理SELECT, INSERT, UPDATE, 和DELETE 请求的事务方法。然后根据不同的事务逻辑建立不同的类实现各个方法。所以可能会有一个类处理使用SQL ...

    Ibatis SqlMap PPT

    缓存机制,事务处理,动态sql,SqlMap

    JTA事务源码示例

    Spring+iBatis+JOTM实现JTA事务: 如何处理跨库事物:spring + jtom 的jta事务是个很好的选择. 这个源码示例非常不错,包括所有的源码和jar包,下载后eclipse 或 myeclipse 导入就能用。 里面有详细的说明和注释,...

    CastleIbatisNet

    解决castle事务处理framework4.0异常,反编译修改后的dll集合,castle+Ibatis.NET集成dll,包含事务处理相关,包含文件列表: Castle.Core.dll Castle.DynamicProxy.dll Castle.Facilities....

    iBATIS 帮助文档

    SQL Maps (com.ibatis.sqlmap.*)......................................................................................................5 SQL Map的概念........................................................

    spring in action英文版

     4.6 Spring和iBATIS  4.6.1 配置SQL Map  4.6.2 使用SqlMapClientTemplate  4.7 Spring和OJB  4.8 小结  第5章 事务管理  5.1 理解事务  5.1.1 仅用4个词解释事务  5.1.2 理解Spring对...

    Spring in Action(第2版)中文版

    目录 第一部分spring的核心 第1章开始spring之旅 1.1spring是什么 1.2开始spring之旅 1.3理解依赖注入 ...b.3.2综合测试事务处理对象 b.3.3测试数据库 b.3.4使用gienahtesting在junit4中进行测试 b.4小结

    Spring in Action(第二版 中文高清版).part2

    第一部分 Spring的核心 第1章 开始Spring之旅 1.1 Spring是什么 1.2 开始Spring之旅 ...B.3.2 综合测试事务处理对象 B.3.3 测试数据库 B.3.4 使用Gienah Testing在JUnit 4中进行测试 B.4 小结

    Spring in Action(第二版 中文高清版).part1

    第一部分 Spring的核心 第1章 开始Spring之旅 1.1 Spring是什么 1.2 开始Spring之旅 ...B.3.2 综合测试事务处理对象 B.3.3 测试数据库 B.3.4 使用Gienah Testing在JUnit 4中进行测试 B.4 小结

Global site tag (gtag.js) - Google Analytics