日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
iBATISDAO事務(wù)淺析

iBATIS DAO事務(wù)的理解要從iBATIS DAO 框架開始,它提供了事務(wù)管理模塊。而這個(gè)事務(wù)管理可以應(yīng)用到很多場(chǎng)合,包括JDBC、Hibernate、JTA、SQLMAP等。

創(chuàng)新互聯(lián)專注于企業(yè)營銷型網(wǎng)站、網(wǎng)站重做改版、會(huì)寧網(wǎng)站定制設(shè)計(jì)、自適應(yīng)品牌網(wǎng)站建設(shè)、H5響應(yīng)式網(wǎng)站、成都做商城網(wǎng)站、集團(tuán)公司官網(wǎng)建設(shè)、成都外貿(mào)網(wǎng)站建設(shè)公司、高端網(wǎng)站制作、響應(yīng)式網(wǎng)頁設(shè)計(jì)等建站業(yè)務(wù),價(jià)格優(yōu)惠性價(jià)比高,為會(huì)寧等各大城市提供網(wǎng)站開發(fā)制作服務(wù)。

下面以最簡單的JDBC來分析一下其如何實(shí)現(xiàn)iBATIS DAO事務(wù)管理。

首先來看一段代碼:

 
 
 
  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(); //***個(gè)事務(wù)  
  16.  
  17. daoManager.startTransaction(); //開始第二個(gè)事務(wù)  
  18.  
  19. orderDao.method1();  
  20. orderDao.method2();  
  21.  
  22. daoManager.commitTransaction();//提交第二個(gè)事務(wù)  
  23. } finally {  
  24. daoManager.endTransaction();  
  25. }  
  26. }  

在method()方法里有著兩個(gè)事務(wù),如果在方法里不顯式的調(diào)用daoManager.startTransaction(),則每個(gè)DAO的一次方法調(diào)用就是一個(gè)獨(dú)立的事務(wù)。

iBATIS DAO事務(wù),有兩個(gè)核心接口DaoTransactionManager和DaoTransaction

對(duì)應(yīng)著不同的數(shù)據(jù)庫持久層實(shí)現(xiàn),兩個(gè)接口分別對(duì)應(yīng)著不同實(shí)現(xiàn)

查看iBATIS 代碼,可以發(fā)現(xiàn)這些manager實(shí)現(xiàn)事務(wù),就是調(diào)用事務(wù)源的事務(wù)操作方法

 
 
 
  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以什么依據(jù)處理事務(wù)呢?DaoTransactionState看看DaoTransactionState的代碼,非常簡單,四個(gè)常量來表示事務(wù)處于的不同的狀態(tài)

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();

那么實(shí)際程序中是如何控制事務(wù)的呢

在***段代碼中,我們是這樣取得DAO

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

實(shí)際daoManager返回的并不是orderDao的具體實(shí)現(xiàn)類,它返回的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;  

看到這段代碼就非常清楚了,每調(diào)用DAO的一次方法時(shí),如果不顯式的調(diào)用daoManager.startTransaction(),就會(huì)成為單獨(dú)的一個(gè)iBATIS DAO事務(wù)。再看看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控制多個(gè)DAO的事務(wù)實(shí)際是讓這些DAO共用了一個(gè)DaoTransaction(ThreadLocal),一個(gè)Connection

這里是一個(gè)事務(wù)源的情況,如果多個(gè)事務(wù)源之間要完成全局事務(wù),還是老老實(shí)實(shí)用分布式事務(wù)管理服務(wù)吧(jta)。

iBATIS DAO事務(wù)的相關(guān)信息就向你介紹到這里,之后的文章里我們還會(huì)提及的,請(qǐng)關(guān)注。


網(wǎng)頁名稱:iBATISDAO事務(wù)淺析
網(wǎng)頁URL:http://www.dlmjj.cn/article/cosccid.html