小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

事務(wù)管理 Transaction Management

 WindySky 2007-08-11
一、事務(wù)

事務(wù)是一個非常重要的編程概念,使用事務(wù),可以很簡單地構(gòu)造出可靠穩(wěn)定的應(yīng)用程序,尤其對那些需要進(jìn)行并發(fā)數(shù)據(jù)訪問的應(yīng)用程序,事務(wù)更是重要的多。
 
使用事務(wù),便可以利用事務(wù)的四個重要屬性:ACID。

* 原子性( atomic):事務(wù)中包含的各項(xiàng)操作必須全部成功執(zhí)行或者全部不執(zhí)行。任何一項(xiàng)操作失敗,將導(dǎo)致整個事務(wù)失敗,其他已經(jīng)執(zhí)行的任務(wù)所作的數(shù)據(jù)操作都將被撤銷,只有所有的操作全部成功,整個事務(wù)才算是成功完成。

* 一致性( consistent):保證了當(dāng)事務(wù)結(jié)束后,系統(tǒng)狀態(tài)是一致的。那么什么是一致的系統(tǒng)狀態(tài)?例如,如果銀行始終遵循著"銀行賬號必須保持正態(tài)平衡"的原則,那么銀行系統(tǒng)的狀態(tài)就是一致的。上面的轉(zhuǎn)賬例子中,在取錢的過程中,賬戶會出現(xiàn)負(fù)態(tài)平衡,在事務(wù)結(jié)束之后,系統(tǒng)又回到一致的狀態(tài)。這樣,系統(tǒng)的狀態(tài)對于客戶來說,始終是一致的。

* 隔離性( isolated):使得并發(fā)執(zhí)行的事務(wù),彼此無法看到對方的中間狀態(tài)。保證了并發(fā)執(zhí)行的事務(wù)順序執(zhí)行,而不會導(dǎo)致系統(tǒng)狀態(tài)不一致。

* 持久性( durable):保證了事務(wù)完成后所作的改動都會被持久化,即使是發(fā)生災(zāi)難性的失敗??苫謴?fù)性資源保存了一份事務(wù)日志,如果資源發(fā)生故障,可以通過日志來將數(shù)據(jù)重建起來。

二、事務(wù)界定

兩種事務(wù)界定的模型
* 聲明式事務(wù)界定
* 編程式事務(wù)界定

三、設(shè)計DAO時需要考慮的問題

* 事務(wù)要如何開始?
* 事務(wù)應(yīng)如何結(jié)束?
* 哪一個對象將負(fù)責(zé)開始一個事務(wù)?
* 哪一個對象將負(fù)責(zé)結(jié)束一個事務(wù)?
* DAO是否要負(fù)責(zé)事務(wù)的開始和結(jié)束?
* 應(yīng)用程序是否需要通過多個DAO訪問數(shù)據(jù)?
* 事務(wù)涉及到一個DAO還是多個DAO?
* 一個DAO是否調(diào)用另一個DA 的方法?

了解上述問題的答案將有助于選擇最適合的DAO的事務(wù)界定策略。在DAO中有兩種主要的界定事務(wù)的策略。一種方式是讓DAO負(fù)責(zé)界定事務(wù),另一種將事務(wù)界定交給調(diào)用這個DAO方法的對象處理。

如果選擇了前一種方式,那么就將事務(wù)代碼嵌入到DAO中。如果選擇后一種方式,那么事務(wù)界定代碼就是在DAO類外面。對于需要在一個事務(wù)中訪問多個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ù)。JTA屬于全局事務(wù),由應(yīng)用服務(wù)器管理(Tomcat需要結(jié)合JOTM(Java Open Transaction Manager)來支持事務(wù)),使用JTA的同時需要使用JNDI。

JTA及其同門兄弟JTS為 J2EE 平臺提供了分布式事務(wù)服務(wù)。一個分布式的事務(wù)涉及一個事務(wù)管理器和一個或者多個資源管理器。一個資源管理器是任何類型的持久性的數(shù)據(jù)存儲。事務(wù)管理器負(fù)責(zé)協(xié)調(diào)所有事務(wù)參與者之間的通信。

 JTA事務(wù)比JDBC事務(wù)功能更強(qiáng)。JDBC事務(wù)局限為一個數(shù)據(jù)庫連接,而JTA事務(wù)可以有多個參與者。所有下列Java平臺組件都可以參與JTA事務(wù):
 * JDBC 連接
 * JDO PersistenceManager 對象
* 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ù)庫的事務(wù)管理器控制。JDBC事務(wù)屬于本地事務(wù),它容易使用,但是存在缺點(diǎn):它們不能用于多個事務(wù)性資源,也就是事務(wù)的范圍局限于一個數(shù)據(jù)庫連接,一個JDBC事務(wù)不能跨越多個數(shù)據(jù)庫。另一個缺點(diǎn)是局部事務(wù)趨向于入侵式的編程模式。

JDBC事務(wù)是用Connection對象控制的。JDBC Connection接口( java.sql.Connection )提供了兩種事務(wù)模式:自動提交和手工提交。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ù),那么就需要有一個實(shí)現(xiàn)javax.sql.XADataSource、javax.sql.XAConnection和javax.sql.XAResource接口的JDBC驅(qū)動程序。一個實(shí)現(xiàn)了這些接口的驅(qū)動程序?qū)⒖梢詤⑴cJTA事務(wù)。一個XADataSource對象就是一個XAConnection對象的工廠。XAConnections是參與JTA事務(wù)的JDBC連接。

并需要用應(yīng)用服務(wù)器的管理工具設(shè)置XADataSource。J2EE應(yīng)用程序用JNDI查詢數(shù)據(jù)源。一旦應(yīng)用程序找到了數(shù)據(jù)源對象,它就調(diào)用javax.sql.DataSource.getConnection()以獲得到數(shù)據(jù)庫的連接。
 
XA連接與非XA連接不同。一定要記住XA連接參與了JTA事務(wù)。這意味著XA連接不支持JDBC的自動提交功能。同時,應(yīng)用程序一定不要對XA連接調(diào)用java.sql.Connection.commit()或者java.sql.Connection.rollback()。相反,應(yīng)用程序應(yīng)該使用 UserTransaction.begin()、UserTransaction.commit()和UserTransaction.rollback() 。

三、Spring、Hibernate和iBatis

這三個框架都有通過JDBC事務(wù)界定的方式實(shí)現(xiàn)事務(wù)管理。但相比之下,Spring在事務(wù)管理方面是其中最成熟的。

1.Spring
Spring Framework實(shí)際上是Expert One-on-One J2EE Design and Development一書中所闡述的設(shè)計思想的具體實(shí)現(xiàn)。
Spring Framework的功能非常多。包含AOP、ORM、DAO、Context、Web、MVC等幾個部分組成。但其中最需要用的是AOP、ORM、Context。Context中,最重要的是Beanfactory,它能將接口與實(shí)現(xiàn)分開,非常強(qiáng)大。前AOP應(yīng)用最成熟的還是在事務(wù)管理上。

2.Hibernate
 Spring框架已經(jīng)提供了對Hibernate框架的良好支持,因此不再需要再頭痛于Hibernate的session管理,事務(wù)管理等方面,這些Spring框架已經(jīng)進(jìn)行了很好的封裝。

3.ibatis
 ibatis不熟悉,如果你對ibatis的事務(wù)管理比較熟悉,請告訴我<yejienihao@hotmail.com>如何ibatis的實(shí)現(xiàn)方式:)

四、推薦閱讀

事務(wù)管理最佳實(shí)踐全面解析
http://dev.csdn.net/author/shendl/7098537bcd8b436197cd7e959936a911.html

事務(wù)管理最佳實(shí)踐多余的話之一
http://dev.csdn.net/author/shendl/4fe0df2717bd47d8b73b31a16f38d1bb.html

事務(wù)管理最佳實(shí)踐多余的話之二
http://dev.csdn.net/author/shendl/7fc1c42ab0a6433eab061943bb380dcf.html 

事務(wù)管理最佳實(shí)踐多余的話之三
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的輕量級J2EE開發(fā)
http://www-128.ibm.com/developerworks/cn/java/j-s-s-i/

在Jstl+Spring+ibatis開發(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/
----
高級DAO編程
http://www-128.ibm.com/developerworks/cn/java/j-dao/
----
基于JDBC的數(shù)據(jù)庫連接池高效管理策略
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的輕量級J2EE開發(fā)
http://www-128.ibm.com/developerworks/cn/java/j-s-s-i/
----
在Jstl+Spring+ibatis開發(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:縮寫列表]
DAO - Data Access Object
JTA - Java Transaction API
JTS - Java Transaction Service (Java事務(wù)服務(wù))
JDBC - Java Database Connectivity

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

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多