JAVA中的事務(wù)介紹-創(chuàng)新互聯(lián)

這篇文章將為大家詳細(xì)講解有關(guān)JAVA中的事務(wù)介紹,文章內(nèi)容質(zhì)量較高,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。

成都創(chuàng)新互聯(lián)公司長期為近1000家客戶提供的網(wǎng)站建設(shè)服務(wù),團(tuán)隊從業(yè)經(jīng)驗10年,關(guān)注不同地域、不同群體,并針對不同對象提供差異化的產(chǎn)品和服務(wù);打造開放共贏平臺,與合作伙伴共同營造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為敦煌企業(yè)提供專業(yè)的成都網(wǎng)站制作、網(wǎng)站設(shè)計、外貿(mào)網(wǎng)站建設(shè),敦煌網(wǎng)站改版等技術(shù)服務(wù)。擁有十余年豐富建站經(jīng)驗和眾多成功案例,為您定制開發(fā)。

1、什么是Java事務(wù)

通常觀念認(rèn)為,事務(wù)與數(shù)據(jù)庫有關(guān)。事務(wù)是訪問數(shù)據(jù)庫的一個操作序列,數(shù)據(jù)庫應(yīng)用系統(tǒng)通過事務(wù)集來完成對數(shù)據(jù)庫的存取。事務(wù)的正確執(zhí)行使得數(shù)據(jù)庫從一種狀態(tài)轉(zhuǎn)換成另一種狀態(tài)。

事務(wù)必須服從ISO/IEC所制定的ACID原則。

ACID是原子性(atomicity)、一致性(consistency)、隔離性(isolation)和持久性(durability)的縮寫事務(wù)必須服從ISO/IEC所制定的ACID原則。ACID是原子性(atomicity)、一致性(consistency)、隔離性(isolation)和持久性(durability)的縮寫。

a、原子性

即不可分割性,事務(wù)要么全部被執(zhí)行,要么就全部不被執(zhí)行。如果事務(wù)的所有子事務(wù)全部提交成功,則所有的數(shù)據(jù)庫操作被提交,數(shù)據(jù)庫狀態(tài)發(fā)生轉(zhuǎn)換;如果有子事務(wù)失敗,則其他子事務(wù)的數(shù)據(jù)庫操作被回滾,即數(shù)據(jù)庫回到事務(wù)執(zhí)行前的狀態(tài),不會發(fā)生狀態(tài)轉(zhuǎn)換。

b、一致性

事務(wù)的執(zhí)行使得數(shù)據(jù)庫從一種正確狀態(tài)轉(zhuǎn)換成另一種正確狀態(tài)。

c、隔離性

在事務(wù)正確提交之前,不允許把該事務(wù)對數(shù)據(jù)的任何改變提供給任何其他事務(wù),即在事務(wù)正確提交之前,它可能的結(jié)果不應(yīng)顯示給任何其他事務(wù)。

d、持久性

事務(wù)正確提交后,其結(jié)果將永久保存在數(shù)據(jù)庫中,即使在事務(wù)提交后有了其他故障,事務(wù)的處理結(jié)果也會得到保存。   

既然事務(wù)的概念從數(shù)據(jù)庫而來,那Java事務(wù)是什么?之間有什么聯(lián)系?

實際上,一個Java應(yīng)用系統(tǒng),如果操作數(shù)據(jù)庫,通過JDBC來實現(xiàn)的。那么增加、修改、刪除都是通過相應(yīng)方法間接來實現(xiàn)的,事務(wù)的控制也相應(yīng)轉(zhuǎn)移到Java程序代碼中。因此,數(shù)據(jù)庫操作的事務(wù)習(xí)慣上就稱為Java事務(wù)。

2、為什么需要事務(wù)

簡單一句話:保持?jǐn)?shù)據(jù)的一致性。

3、Java事務(wù)類型

Java事務(wù)的類型有三種:JDBC事務(wù)、JTA(Java Transaction API)事務(wù)、容器事務(wù)。這里都是最簡單的介紹,最后還會介紹下jdbc事務(wù)的使用,其他兩種大家可以自己搜下學(xué)習(xí)下。

a、JDBC事務(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 事務(wù)界定時,您可以將多個 SQL 語句結(jié)合到一個事務(wù)中。JDBC 事務(wù)的一個缺點是事務(wù)的范圍局限于一個數(shù)據(jù)庫連接。一個 JDBC 事務(wù)不能跨越多個數(shù)據(jù)庫。

b、JTA(Java Transaction API)事務(wù)

JTA是一種高層的,與實現(xiàn)無關(guān)的,與協(xié)議無關(guān)的API,應(yīng)用程序和應(yīng)用服務(wù)器可以使用JTA來訪問事務(wù)。

JTA允許應(yīng)用程序執(zhí)行分布式事務(wù)處理--在兩個或多個網(wǎng)絡(luò)計算機(jī)資源上訪問并且更新數(shù)據(jù),這些數(shù)據(jù)可以分布在多個數(shù)據(jù)庫上。JDBC驅(qū)動程序的JTA支持極大地增強(qiáng)了數(shù)據(jù)訪問能力。

如果計劃用 JTA 界定事務(wù),那么就需要有一個實現(xiàn) javax.sql.XADataSource 、 javax.sql.XAConnection 和 javax.sql.XAResource 接口的 JDBC 驅(qū)動程序。

一個實現(xiàn)了這些接口的驅(qū)動程序?qū)⒖梢詤⑴c JTA 事務(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() 和 serTransaction.rollback() 。

c、容器事務(wù)

容器事務(wù)主要是J2EE應(yīng)用服務(wù)器提供的,容器事務(wù)大多是基于JTA完成,這是一個基于JNDI的,相當(dāng)復(fù)雜的API實現(xiàn)。相對編碼實現(xiàn)JTA事務(wù)管理,我們可以通過EJB容器提供的容器事務(wù)管理機(jī)制(CMT)完成同一個功能,這項功能由J2EE應(yīng)用服務(wù)器提供。

這使得我們可以簡單的指定將哪個方法加入事務(wù),一旦指定,容器將負(fù)責(zé)事務(wù)管理任務(wù)。這是我們土建的解決方式,因為通過這種方式我們可以將事務(wù)代碼排除在邏輯編碼之外,同時將所有困難交給J2EE容器去解決。

使用EJB CMT的另外一個好處就是程序員無需關(guān)心JTA API的編碼,不過,理論上我們必須使用EJB。

d、JDBC事務(wù)的使用

(1)步驟:

首先,設(shè)置事務(wù)的提交方式為非自動提交:conn.setAutoCommit(false);接下來,將需要添加事務(wù)的代碼放入try,catch塊中。

然后,在try塊內(nèi)添加事務(wù)的提交操作,表示操作無異常,提交事務(wù):conn.commit();尤其不要忘記,在catch塊內(nèi)添加回滾事務(wù),表示操作出現(xiàn)異常,撤銷事務(wù):conn.rollback();最后,設(shè)置事務(wù)提交方式為自動提交:conn.setAutoCommit(true);這樣,通過簡單的幾步,我們就可以完成對事務(wù)處理的編寫了。

(2)偽代碼:

con = DriverManager.getConnection(url, user, password);
String result = "";
String sql1 = "";
// LAST_INSERT_ID() 獲取剛剛插入的自動遞增的ID
String sql2 = "";
int flag;
try {
    con.setAutoCommit(false);// 更改JDBC事務(wù)的默認(rèn)提交方式
    pstmt = con.prepareStatement(sql1);
    flag = pstmt.executeUpdate();
    if (flag > 0) {
        pstmt = con.prepareStatement(sql2);
        int i = pstmt.executeUpdate();
        if (i > 0) {
            con.commit();//提交JDBC事務(wù)
            result = "add data success!!";
        } else {
            result = "add data fail!!";
       }
    } else {
        result = "add data fail!!";
    }
} catch (SQLException e) {
    try {
        con.rollback();//回滾JDBC事務(wù)
    } catch (SQLException e1) {
    // TODO Auto-generated catch block
        result = "add data fail!! SQLException";
        e1.printStackTrace();
    }
    result = "add data fail!! SQLException";
    e.printStackTrace();
} finally {
    try {
        con.setAutoCommit(true); // 恢復(fù)JDBC事務(wù)的默認(rèn)提交方式
    } catch (SQLException e) {
    // TODO Auto-generated catch block
        e.printStackTrace();
    }
}
return result;

4、三種事務(wù)差異

1、JDBC事務(wù)控制的局限性在一個數(shù)據(jù)庫連接內(nèi),但是其使用簡單。

2、JTA事務(wù)的功能強(qiáng)大,事務(wù)可以跨越多個數(shù)據(jù)庫或多個DAO,使用也比較復(fù)雜。

3、容器事務(wù),主要指的是J2EE應(yīng)用服務(wù)器提供的事務(wù)管理,局限于EJB應(yīng)用使用。

5、總結(jié)

事務(wù)控制是構(gòu)建J2EE應(yīng)用不可缺少的一部分,合理選擇應(yīng)用何種事務(wù)對整個應(yīng)用系統(tǒng)來說至關(guān)重要。一般說來,在單個JDBC 連接連接的情況下可以選擇JDBC事務(wù),在跨多個連接或者數(shù)據(jù)庫情況下,需要選擇使用JTA事務(wù),如果用到了EJB,則可以考慮使用EJB容器事務(wù)。

關(guān)于JAVA中的事務(wù)介紹就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。

分享標(biāo)題:JAVA中的事務(wù)介紹-創(chuàng)新互聯(lián)
網(wǎng)頁URL:http://bm7419.com/article46/dcodhg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供服務(wù)器托管、手機(jī)網(wǎng)站建設(shè)、做網(wǎng)站、網(wǎng)站制作、微信公眾號、外貿(mào)網(wǎng)站建設(shè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都app開發(fā)公司