一、事務(wù)
事務(wù)是一個(gè)非常重要的編程概念,使用事務(wù),可以很簡(jiǎn)單地構(gòu)造出可靠穩(wěn)定的應(yīng)用程序,尤其對(duì)那些需要進(jìn)行并發(fā)數(shù)據(jù)訪問(wèn)的應(yīng)用程序,事務(wù)更是重要的多。 使用事務(wù),便可以利用事務(wù)的四個(gè)重要屬性:ACID。 * 原子性( atomic):事務(wù)中包含的各項(xiàng)操作必須全部成功執(zhí)行或者全部不執(zhí)行。任何一項(xiàng)操作失敗,將導(dǎo)致整個(gè)事務(wù)失敗,其他已經(jīng)執(zhí)行的任務(wù)所作的數(shù)據(jù)操作都將被撤銷(xiāo),只有所有的操作全部成功,整個(gè)事務(wù)才算是成功完成。 * 一致性( consistent):保證了當(dāng)事務(wù)結(jié)束后,系統(tǒng)狀態(tài)是一致的。那么什么是一致的系統(tǒng)狀態(tài)?例如,如果銀行始終遵循著"銀行賬號(hào)必須保持正態(tài)平衡"的原則,那么銀行系統(tǒng)的狀態(tài)就是一致的。上面的轉(zhuǎn)賬例子中,在取錢(qián)的過(guò)程中,賬戶(hù)會(huì)出現(xiàn)負(fù)態(tài)平衡,在事務(wù)結(jié)束之后,系統(tǒng)又回到一致的狀態(tài)。這樣,系統(tǒng)的狀態(tài)對(duì)于客戶(hù)來(lái)說(shuō),始終是一致的。 * 隔離性( isolated):使得并發(fā)執(zhí)行的事務(wù),彼此無(wú)法看到對(duì)方的中間狀態(tài)。保證了并發(fā)執(zhí)行的事務(wù)順序執(zhí)行,而不會(huì)導(dǎo)致系統(tǒng)狀態(tài)不一致。 * 持久性( durable):保證了事務(wù)完成后所作的改動(dòng)都會(huì)被持久化,即使是發(fā)生災(zāi)難性的失敗??苫謴?fù)性資源保存了一份事務(wù)日志,如果資源發(fā)生故障,可以通過(guò)日志來(lái)將數(shù)據(jù)重建起來(lái)。 二、事務(wù)界定 兩種事務(wù)界定的模型 * 聲明式事務(wù)界定 * 編程式事務(wù)界定 三、設(shè)計(jì)DAO時(shí)需要考慮的問(wèn)題 * 事務(wù)要如何開(kāi)始? * 事務(wù)應(yīng)如何結(jié)束? * 哪一個(gè)對(duì)象將負(fù)責(zé)開(kāi)始一個(gè)事務(wù)? * 哪一個(gè)對(duì)象將負(fù)責(zé)結(jié)束一個(gè)事務(wù)? * DAO是否要負(fù)責(zé)事務(wù)的開(kāi)始和結(jié)束? * 應(yīng)用程序是否需要通過(guò)多個(gè)DAO訪問(wèn)數(shù)據(jù)? * 事務(wù)涉及到一個(gè)DAO還是多個(gè)DAO? * 一個(gè)DAO是否調(diào)用另一個(gè)DA 的方法? 了解上述問(wèn)題的答案將有助于選擇最適合的DAO的事務(wù)界定策略。在DAO中有兩種主要的界定事務(wù)的策略。一種方式是讓DAO負(fù)責(zé)界定事務(wù),另一種將事務(wù)界定交給調(diào)用這個(gè)DAO方法的對(duì)象處理。 如果選擇了前一種方式,那么就將事務(wù)代碼嵌入到DAO中。如果選擇后一種方式,那么事務(wù)界定代碼就是在DAO類(lèi)外面。對(duì)于需要在一個(gè)事務(wù)中訪問(wèn)多個(gè)DAO的應(yīng)用程序應(yīng)該使用第二中策略。 四、事務(wù)界定兩種實(shí)現(xiàn)方式 JTA事務(wù)和JDBC事務(wù) 1.JTA事務(wù) JTA是一種不受實(shí)施限制的高層協(xié)議API,該協(xié)議API使應(yīng)用程序和應(yīng)用服務(wù)器可以訪問(wèn)事務(wù)。JTA屬于全局事務(wù),由應(yīng)用服務(wù)器管理(Tomcat需要結(jié)合JOTM(Java Open Transaction Manager)來(lái)支持事務(wù)),使用JTA的同時(shí)需要使用JNDI。 JTA及其同門(mén)兄弟JTS為 J2EE 平臺(tái)提供了分布式事務(wù)服務(wù)。一個(gè)分布式的事務(wù)涉及一個(gè)事務(wù)管理器和一個(gè)或者多個(gè)資源管理器。一個(gè)資源管理器是任何類(lèi)型的持久性的數(shù)據(jù)存儲(chǔ)。事務(wù)管理器負(fù)責(zé)協(xié)調(diào)所有事務(wù)參與者之間的通信。 JTA事務(wù)比JDBC事務(wù)功能更強(qiáng)。JDBC事務(wù)局限為一個(gè)數(shù)據(jù)庫(kù)連接,而JTA事務(wù)可以有多個(gè)參與者。所有下列Java平臺(tái)組件都可以參與JTA事務(wù): * JDBC 連接 * JDO PersistenceManager 對(duì)象 * JMS 隊(duì)列 * JMS 主題 * 企業(yè) JavaBeans * 符合 J2EE 連接體系結(jié)構(gòu)(J2EE Connector Architecture)規(guī)范的資源適配器 要用JTA進(jìn)行事務(wù)界定,應(yīng)用程序要調(diào)用javax.transaction.UserTransaction接口中的方法: * public void begin() * public void commit() * public void rollback() * public int getStatus() * public void setRollbackOnly() * public void setTransactionTimeout(int) [代碼示例:JTA進(jìn)行事務(wù)界定] import javax.transaction.*; import javax.naming.*; // ... InitialContext ctx = new InitialContext(); Object txObj = ctx.lookup("java:comp/UserTransaction"); UserTransaction utx = (UserTransaction) txObj; utx.begin(); // ... DataSource ds = obtainXADataSource(); Connection conn = ds.getConnection(); pstmt = conn.prepareStatement("Update MOVIES ..."); pstmt.setString(1, "Spinal Tap"); pstmt.executeUpdate(); // ... utx.commit(); // ... [/代碼示例] 2.JDBC事務(wù) JDBC事務(wù)受數(shù)據(jù)庫(kù)的事務(wù)管理器控制。JDBC事務(wù)屬于本地事務(wù),它容易使用,但是存在缺點(diǎn):它們不能用于多個(gè)事務(wù)性資源,也就是事務(wù)的范圍局限于一個(gè)數(shù)據(jù)庫(kù)連接,一個(gè)JDBC事務(wù)不能跨越多個(gè)數(shù)據(jù)庫(kù)。另一個(gè)缺點(diǎn)是局部事務(wù)趨向于入侵式的編程模式。 JDBC事務(wù)是用Connection對(duì)象控制的。JDBC Connection接口( java.sql.Connection )提供了兩種事務(wù)模式:自動(dòng)提交和手工提交。java.sql.Connection 提供了以下控制事務(wù)的方法: * public void setAutoCommit(boolean) * public boolean getAutoCommit() * public void commit() * public void rollback() [代碼示例:用JDBC API進(jìn)行事務(wù)界定] import java.sql.*; import javax.sql.*; // ... DataSource ds = obtainDataSource(); Connection conn = ds.getConnection(); conn.setAutoCommit(false); // ... pstmt = conn.prepareStatement("Update MOVIES ..."); pstmt.setString(1, "The Great Escape"); pstmt.executeUpdate(); // ... conn.commit(); // ... [/代碼示例] JDBC支持的四種事務(wù)隔離模式(transaction isolation mode)。 3.JTA和JDBC 用JTA界定事務(wù),那么就需要有一個(gè)實(shí)現(xiàn)javax.sql.XADataSource、javax.sql.XAConnection和javax.sql.XAResource接口的JDBC驅(qū)動(dòng)程序。一個(gè)實(shí)現(xiàn)了這些接口的驅(qū)動(dòng)程序?qū)⒖梢詤⑴cJTA事務(wù)。一個(gè)XADataSource對(duì)象就是一個(gè)XAConnection對(duì)象的工廠。XAConnections是參與JTA事務(wù)的JDBC連接。 并需要用應(yīng)用服務(wù)器的管理工具設(shè)置XADataSource。J2EE應(yīng)用程序用JNDI查詢(xún)數(shù)據(jù)源。一旦應(yīng)用程序找到了數(shù)據(jù)源對(duì)象,它就調(diào)用javax.sql.DataSource.getConnection()以獲得到數(shù)據(jù)庫(kù)的連接。 XA連接與非XA連接不同。一定要記住XA連接參與了JTA事務(wù)。這意味著XA連接不支持JDBC的自動(dòng)提交功能。同時(shí),應(yīng)用程序一定不要對(duì)XA連接調(diào)用java.sql.Connection.commit()或者java.sql.Connection.rollback()。相反,應(yīng)用程序應(yīng)該使用 UserTransaction.begin()、UserTransaction.commit()和UserTransaction.rollback() 。 三、Spring、Hibernate和iBatis 這三個(gè)框架都有通過(guò)JDBC事務(wù)界定的方式實(shí)現(xiàn)事務(wù)管理。但相比之下,Spring在事務(wù)管理方面是其中最成熟的。 1.Spring Spring Framework實(shí)際上是Expert One-on-One J2EE Design and Development一書(shū)中所闡述的設(shè)計(jì)思想的具體實(shí)現(xiàn)。 Spring Framework的功能非常多。包含AOP、ORM、DAO、Context、Web、MVC等幾個(gè)部分組成。但其中最需要用的是AOP、ORM、Context。Context中,最重要的是Beanfactory,它能將接口與實(shí)現(xiàn)分開(kāi),非常強(qiáng)大。前AOP應(yīng)用最成熟的還是在事務(wù)管理上。 2.Hibernate Spring框架已經(jīng)提供了對(duì)Hibernate框架的良好支持,因此不再需要再頭痛于Hibernate的session管理,事務(wù)管理等方面,這些Spring框架已經(jīng)進(jìn)行了很好的封裝。 3.ibatis ibatis不熟悉,如果你對(duì)ibatis的事務(wù)管理比較熟悉,請(qǐng)告訴我<yejienihao@hotmail.com>如何ibatis的實(shí)現(xiàn)方式:) 四、推薦閱讀 事務(wù)管理最佳實(shí)踐全面解析 http://dev.csdn.net/author/shendl/7098537bcd8b436197cd7e959936a911.html 事務(wù)管理最佳實(shí)踐多余的話(huà)之一 http://dev.csdn.net/author/shendl/4fe0df2717bd47d8b73b31a16f38d1bb.html 事務(wù)管理最佳實(shí)踐多余的話(huà)之二 http://dev.csdn.net/author/shendl/7fc1c42ab0a6433eab061943bb380dcf.html 事務(wù)管理最佳實(shí)踐多余的話(huà)之三 http://dev.csdn.net/author/shendl/f4f97546410a4653949ba8ae837c4383.html 集成 Hibernate,Spring,Struts Portlet 框架構(gòu)建Portlet應(yīng)用 http://www-128.ibm.com/developerworks/cn/websphere/library/techarticles/guorui/ 基于struts+spring+ibatis的輕量級(jí)J2EE開(kāi)發(fā) http://www-128.ibm.com/developerworks/cn/java/j-s-s-i/ 在Jstl+Spring+ibatis開(kāi)發(fā)中應(yīng)用事務(wù)管理經(jīng)驗(yàn)總結(jié) http://blog.donews.com/yarak/archive/2006/04/25/845534.aspx [附錄1:參考文獻(xiàn)] 使用Enterprise Bean處理事務(wù), http://gceclub./staticcontent/html/sunone/app7/app7-dg-ejb/detrans.html ---- 事務(wù)服務(wù)淺析 http://www-128.ibm.com/developerworks/cn/java/l-transation/part1/ http://www-128.ibm.com/developerworks/cn/java/l-transation/part2/ ---- 高級(jí)DAO編程 http://www-128.ibm.com/developerworks/cn/java/j-dao/ ---- 基于JDBC的數(shù)據(jù)庫(kù)連接池高效管理策略 http://www-128.ibm.com/developerworks/cn/java/l-jdbcperform/ ---- Spring 事務(wù)管理 http://www./reference2/html/transaction.html ---- 分析Hibernate的事務(wù)處理機(jī)制 http://www.yesky.com/255/1922255.shtml ---- 集成 Hibernate,Spring,Struts Portlet 框架構(gòu)建Portlet應(yīng)用 http://www-128.ibm.com/developerworks/cn/websphere/library/techarticles/guorui/ ---- 基于struts+spring+ibatis的輕量級(jí)J2EE開(kāi)發(fā) http://www-128.ibm.com/developerworks/cn/java/j-s-s-i/ ---- 在Jstl+Spring+ibatis開(kāi)發(fā)中應(yīng)用事務(wù)管理經(jīng)驗(yàn)總結(jié) http://blog.donews.com/yarak/archive/2006/04/25/845534.aspx ---- How to use JDBC and transactions in Tomcat with JOTM http://jotm./current/jotm/doc/howto-tomcat-jotm.html [附錄2:縮寫(xiě)列表] DAO - Data Access Object JTA - Java Transaction API JTS - Java Transaction Service (Java事務(wù)服務(wù)) JDBC - Java Database Connectivity |
|
來(lái)自: WindySky > 《后端技術(shù)》