iBATIS DAO事务浅析
创始人
2024-04-18 09:01:36
0

iBATIS DAO事务的理解要从iBATIS DAO 框架开始,它提供了事务管理模块。而这个事务管理可以应用到很多场合,包括JDBC、Hibernate、JTA、SQLMAP等。

下面以最简单的JDBC来分析一下其如何实现iBATIS DAO事务管理。

首先来看一段代码:

  1. public class OrderService {  
  2.  
  3. private DaoManager daoManager;  
  4.  
  5. private OrderDao orderDao;  
  6.  
  7. public OrderService() {  
  8. daoManager = DaoConfig.getDaoManager();  
  9. orderDao = (OrderDao) daoManager.getDao(OrderDao.class);  
  10. }  
  11.  
  12. public void method() {  
  13. try {  
  14. //a separate transaction  
  15. orderDao.method1(); //***个事务  
  16.  
  17. daoManager.startTransaction(); //开始第二个事务  
  18.  
  19. orderDao.method1();  
  20. orderDao.method2();  
  21.  
  22. daoManager.commitTransaction();//提交第二个事务  
  23. } finally {  
  24. daoManager.endTransaction();  
  25. }  
  26. }  

在method()方法里有着两个事务,如果在方法里不显式的调用daoManager.startTransaction(),则每个DAO的一次方法调用就是一个独立的事务。

iBATIS DAO事务,有两个核心接口DaoTransactionManager和DaoTransaction

对应着不同的数据库持久层实现,两个接口分别对应着不同实现

查看iBATIS 代码,可以发现这些manager实现事务,就是调用事务源的事务操作方法

  1. JdbcDaoTransactionManager  
  2. public void commitTransaction(DaoTransaction trans) {  
  3. ((JdbcDaoTransaction) trans).commit();  
  4. }  
  5.  JdbcDaoTransaction  
  6. public JdbcDaoTransaction(DataSource dataSource) {  
  7. try {  
  8. connection = dataSource.getConnection();  
  9. if (connection == null) {  
  10. throw new DaoException("Could not start transaction.Cause: The DataSource returned a null connection.");  
  11. }  
  12. if (connection.getAutoCommit()) {  
  13. connection.setAutoCommit(false);  
  14. }  
  15. if (connectionLog.isDebugEnabled()) {  
  16. connection = ConnectionLogProxy.newInstance(connection);  
  17. }  
  18. } catch (SQLException e) {  
  19. throw new DaoException("Error starting JDBC transaction.Cause: " + e);  
  20. }  
  21. }  
  22.  
  23. public void commit() {  
  24. try {  
  25. try {  
  26. connection.commit();  
  27. } finally {  
  28. connection.close();  
  29. }  
  30. } catch (SQLException e) {  
  31. throw new DaoException("Error committing JDBC transaction.Cause: " + e);  
  32. }  

那么DaoTransactionManager以什么依据处理事务呢?DaoTransactionState看看DaoTransactionState的代码,非常简单,四个常量来表示事务处于的不同的状态

public static final DaoTransactionState ACTIVE = new DaoTransactionState();

public static final DaoTransactionState INACTIVE = new DaoTransactionState();

public static final DaoTransactionState COMMITTED = new DaoTransactionState();

public static final DaoTransactionState ROLLEDBACK = new DaoTransactionState();

那么实际程序中是如何控制事务的呢

在***段代码中,我们是这样取得DAO

orderDao = (OrderDao) daoManager.getDao(OrderDao.class);

实际daoManager返回的并不是orderDao的具体实现类,它返回的DaoProxy

DaoProxy

  1. public Object invoke(Object proxy, Method method, Object[] args)  
  2. throws Throwable {  
  3. Object result = null;  
  4. if (PASSTHROUGH_METHODS.contains(method.getName())) {  
  5. try {  
  6. result = method.invoke(daoImpl.getDaoInstance(), args);  
  7. } catch (Throwable t) {  
  8. throw ClassInfo.unwrapThrowable(t);  
  9. }  
  10. } else {  
  11. StandardDaoManager daoManager = daoImpl.getDaoManager();  
  12. DaoContext context = daoImpl.getDaoContext();  
  13.  
  14. if (daoManager.isExplicitTransaction()) {  
  15. // Just start the transaction (explicit)  
  16. try {  
  17. context.startTransaction();  
  18. result = method.invoke(daoImpl.getDaoInstance(), args);  
  19. } catch (Throwable t) {  
  20. throw ClassInfo.unwrapThrowable(t);  
  21. }  
  22. } else {  
  23. // Start, commit and end the transaction (autocommit)  
  24. try {  
  25. context.startTransaction();  
  26. result = method.invoke(daoImpl.getDaoInstance(), args);  
  27. context.commitTransaction();  
  28. } catch (Throwable t) {  
  29. throw ClassInfo.unwrapThrowable(t);  
  30. } finally {  
  31. context.endTransaction();  
  32. }  
  33. }  
  34.  
  35. }  
  36. return result;  

看到这段代码就非常清楚了,每调用DAO的一次方法时,如果不显式的调用daoManager.startTransaction(),就会成为单独的一个iBATIS DAO事务。再看看iBATIS为我们提供的摸板JdbcDaoTemplate

  1. protected Connection getConnection() {  
  2. DaoTransaction trans = daoManager.getTransaction(this);  
  3. if (!(trans instanceof ConnectionDaoTransaction)) {  
  4. throw new DaoException("The DAO manager of type " + daoManager.getClass().getName() +  
  5. " cannot supply a JDBC Connection for this template, and is therefore not" +  
  6. "supported by JdbcDaoTemplate.");  
  7. }  
  8. return ((ConnectionDaoTransaction) trans).getConnection();  

iBATIS控制多个DAO的事务实际是让这些DAO共用了一个DaoTransaction(ThreadLocal),一个Connection

这里是一个事务源的情况,如果多个事务源之间要完成全局事务,还是老老实实用分布式事务管理服务吧(jta)。

iBATIS DAO事务的相关信息就向你介绍到这里,之后的文章里我们还会提及的,请关注。

【编辑推荐】

  1. Struts2.0+Springframework2.5+ibatis2.3***整合实例
  2. Struts2.0+ibatis2.3***整合实例之映射浅析
  3. Struts2.0+ibatis2.3整合实例实现服务层及Struts
  4. Struts2.0+ibatis2.3整合实例实现UI层浅析
  5. iBATIS入门程序六大步详解

相关内容

热门资讯

如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
施耐德电气数据中心整体解决方案... 近日,全球能效管理专家施耐德电气正式启动大型体验活动“能效中国行——2012卡车巡展”,作为该活动的...
20个非常棒的扁平设计免费资源 Apple设备的平面图标PSD免费平板UI 平板UI套件24平图标Freen平板UI套件PSD径向平...
德国电信门户网站可实时显示全球... 德国电信周三推出一个门户网站,直观地实时提供其安装在全球各地的传感器网络检测到的网络攻击状况。该网站...
为啥国人偏爱 Mybatis,... 关于 SQL 和 ORM 的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行...
《非诚勿扰》红人闫凤娇被曝厕所... 【51CTO.com 综合消息360安全专家提醒说,“闫凤娇”、“非诚勿扰”已经被黑客盯上成为了“木...
2012年第四季度互联网状况报... [[71653]]  北京时间4月25日消息,据国外媒体报道,全球知名的云平台公司Akamai Te...