日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

事務(wù)管理 Transaction Management

 WindySky 2007-08-11
一、事務(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

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶(hù)發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶(hù) 評(píng)論公約

    類(lèi)似文章 更多