您好,登錄后才能下訂單哦!
怎么進行iBATIS DAO事務淺析,針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。
iBATIS DAO事務的理解要從iBATIS DAO 框架開始,它提供了事務管理模塊。而這個事務管理可以應用到很多場合,包括JDBC、Hibernate、JTA、SQLMAP等。
下面以最簡單的JDBC來分析一下其如何實現iBATIS DAO事務管理。
首先來看一段代碼:
public class OrderService { private DaoManager daoManager; private OrderDao orderDao; public OrderService() { daoManager = DaoConfig.getDaoManager(); orderDao = (OrderDao) daoManager.getDao(OrderDao.class); } public void method() { try { //a separate transaction orderDao.method1(); //***個事務 daoManager.startTransaction(); //開始第二個事務 orderDao.method1(); orderDao.method2(); daoManager.commitTransaction();//提交第二個事務 } finally { daoManager.endTransaction(); } } }
在method()方法里有著兩個事務,如果在方法里不顯式的調用daoManager.startTransaction(),則每個DAO的一次方法調用就是一個獨立的事務。
iBATIS DAO事務,有兩個核心接口DaoTransactionManager和DaoTransaction
對應著不同的數據庫持久層實現,兩個接口分別對應著不同實現
查看iBATIS 代碼,可以發現這些manager實現事務,就是調用事務源的事務操作方法
JdbcDaoTransactionManager public void commitTransaction(DaoTransaction trans) { ((JdbcDaoTransaction) trans).commit(); } JdbcDaoTransaction public JdbcDaoTransaction(DataSource dataSource) { try { connection = dataSource.getConnection(); if (connection == null) { throw new DaoException("Could not start transaction.Cause: The DataSource returned a null connection."); } if (connection.getAutoCommit()) { connection.setAutoCommit(false); } if (connectionLog.isDebugEnabled()) { connection = ConnectionLogProxy.newInstance(connection); } } catch (SQLException e) { throw new DaoException("Error starting JDBC transaction.Cause: " + e); } } public void commit() { try { try { connection.commit(); } finally { connection.close(); } } catch (SQLException e) { throw new DaoException("Error committing JDBC transaction.Cause: " + e); } }
那么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
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { Object result = null; if (PASSTHROUGH_METHODS.contains(method.getName())) { try { result = method.invoke(daoImpl.getDaoInstance(), args); } catch (Throwable t) { throw ClassInfo.unwrapThrowable(t); } } else { StandardDaoManager daoManager = daoImpl.getDaoManager(); DaoContext context = daoImpl.getDaoContext(); if (daoManager.isExplicitTransaction()) { // Just start the transaction (explicit) try { context.startTransaction(); result = method.invoke(daoImpl.getDaoInstance(), args); } catch (Throwable t) { throw ClassInfo.unwrapThrowable(t); } } else { // Start, commit and end the transaction (autocommit) try { context.startTransaction(); result = method.invoke(daoImpl.getDaoInstance(), args); context.commitTransaction(); } catch (Throwable t) { throw ClassInfo.unwrapThrowable(t); } finally { context.endTransaction(); } } } return result; }
看到這段代碼就非常清楚了,每調用DAO的一次方法時,如果不顯式的調用daoManager.startTransaction(),就會成為單獨的一個iBATIS DAO事務。再看看iBATIS為我們提供的摸板JdbcDaoTemplate
protected Connection getConnection() { DaoTransaction trans = daoManager.getTransaction(this); if (!(trans instanceof ConnectionDaoTransaction)) { throw new DaoException("The DAO manager of type " + daoManager.getClass().getName() + " cannot supply a JDBC Connection for this template, and is therefore not" + "supported by JdbcDaoTemplate."); } return ((ConnectionDaoTransaction) trans).getConnection(); }
iBATIS控制多個DAO的事務實際是讓這些DAO共用了一個DaoTransaction(ThreadLocal),一個Connection
這里是一個事務源的情況,如果多個事務源之間要完成全局事務,還是老老實實用分布式事務管理服務吧(jta)。
關于怎么進行iBATIS DAO事務淺析問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。