你的位置:pcMing工作室 >> 资讯 >> JAVA/JSP >> iBatis >> 详细内容 在线投稿

iBATIS事务处理浅析

排行榜 收藏 打印 发给朋友 举报 来源: 互联网   发布者:fhqllt
热度1215票  浏览374次 【共0条评论】【我要评论 时间:2010年10月23日 21:08

Q GQ0Dz"pO2XN0iBATIS事务处理这部分是和Dao紧密相联的。

/y3r+ErTW9a z0pcMing工作室zn w.s7mil

我们在使用Dao时,如以下代码,先插入新记录,再进行更新:pcMing工作室 V Pw/b}~~Ddt

  1. personDao.insertPerson (person); // Starts transaction 
  2. person.setLastName("Begin");  
  3. personDao.updatePerson (person); // Starts a new transaction 
pcMing工作室-e3H.iT%w5acO

因为没有显式地启动事务,iBatis会认为这是两次事务,分别从连接池中取两次Connectio。pcMing工作室yYc-N7D

pcMing工作室.f$J3bz%J

我们所写的Dao子类(继承自com.ibatis.dao.client.template.SqlMapDaoTemplate)的每一个Dao方法已经默认为一个事务(通过动态代理)。

D~g#U |8c0

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

'^K*S:lQ$i%R0

]/HAXf-v{ K0DaoManager provides access to all DAOs it manages and also allows transactions to be committed and ended (possibly rolled back)pcMing工作室9K#b$}8M0o o

*rk[.o-^;C vw0众Dao子类由DaoManager产生,如:pcMing工作室:i sCT K)t6W~

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

K0JOHg T0UserDao是用户自己定义的接口,获得的其实是在dao.xml中指定的相对应的 SqlMapDao实现类,从而实现了松藕合。在良好的分层设计中,pcMing工作室3\;~O(r)D})ga}

9GU;] X$tQ_ x(}0iBATIS事务处理之业务层(service包)只需要知道Dao接口,而不去关心其具体怎么实现。pcMing工作室3b"V)p4Vgo3~\

'SJlb pf7N Y0如果显式地声明事务处理语句,如下:

,N oQkP@}0
  1. try {  
  2. daoManager.startTransaction();  
  3. personDao.insertPerson (person);   
  4. person.setLastName("Begin");  
  5. personDao.updatePerson(person);   
  6. otherDao.doSomething(other);  
  7. ...  
  8. daoManager.commitTransaction();  
  9. finally {  
  10. daoManager.endTransaction();  
pcMing工作室HF7|,o!v|g#zp\d

这样就保持了原子性,整体为一个事务,要么全部执行成功,否则回滚。pcMing工作室)C)ki8r'S lK Bd

pcMing工作室v0^cHI/f

现在唯一的问题就是,dao层的事务是否已经放弃,否则产生事务嵌套问题对性能会有影响pcMing工作室$qW4X7Qi

{,L.c'c&a:r0当然,iBatis 完全可以这么做:建一个声明式接口:IService,再使用动态代理,将用户自己的Serivce子类通过动态代理自动包上事务处理的代码,默 认每一个业务方法为一个事务。pcMing工作室6f |9^rZ%K4k_

pcMing工作室Dwi*\&W(B6u

大师的心如果能轻易揣测,就是不大师了:),估计大师认为这样属于过度设计,他认为把这种灵活性交给用户是合适的,相当多的service 方法只调用一个Dao方法,例如CRUD操作。

r)O&mo.d#sb:]VG0

8|A{r,FG0再补充一下,iBatis中对事务的处理是可配置的,最常用的Type是"JDBC",也可以声明为"JTA"或"EXTERNAL".

6v2A"Qx|mo4bve~:U0pcMing工作室S)`:jek

iBATIS事务处理相关的介绍就到这里,是不是对iBATIS事务处理有了一定的了解呢?pcMing工作室%bu!`0e(@kR9ue-|1QK

TAG: iBatis ibatis iBATIS
顶:61 踩:65
对本文中的事件或人物打分:
当前平均分:-0.03 (400次打分)
对本篇资讯内容的质量打分:
当前平均分:-0.4 (361次打分)
【已经有328人表态】
55票
感动
46票
路过
43票
高兴
32票
难过
32票
搞笑
29票
愤怒
44票
无聊
47票
同情
上一篇 下一篇
发表评论
换一张

网友评论仅供网友表达个人看法,并不表明本网同意其观点或证实其描述。

查看全部回复【已有0位网友发表了看法】

网络资源