這篇文章將為大家詳細講解有關(guān)JAVA中的事務介紹,文章內(nèi)容質(zhì)量較高,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。
創(chuàng)新互聯(lián)建站專注于企業(yè)成都營銷網(wǎng)站建設(shè)、網(wǎng)站重做改版、璧山網(wǎng)站定制設(shè)計、自適應品牌網(wǎng)站建設(shè)、H5技術(shù)、商城網(wǎng)站建設(shè)、集團公司官網(wǎng)建設(shè)、外貿(mào)營銷網(wǎng)站建設(shè)、高端網(wǎng)站制作、響應式網(wǎng)頁設(shè)計等建站業(yè)務,價格優(yōu)惠性價比高,為璧山等各大城市提供網(wǎng)站開發(fā)制作服務。
1、什么是Java事務
通常觀念認為,事務與數(shù)據(jù)庫有關(guān)。事務是訪問數(shù)據(jù)庫的一個操作序列,數(shù)據(jù)庫應用系統(tǒng)通過事務集來完成對數(shù)據(jù)庫的存取。事務的正確執(zhí)行使得數(shù)據(jù)庫從一種狀態(tài)轉(zhuǎn)換成另一種狀態(tài)。
事務必須服從ISO/IEC所制定的ACID原則。
ACID是原子性(atomicity)、一致性(consistency)、隔離性(isolation)和持久性(durability)的縮寫事務必須服從ISO/IEC所制定的ACID原則。ACID是原子性(atomicity)、一致性(consistency)、隔離性(isolation)和持久性(durability)的縮寫。
a、原子性
即不可分割性,事務要么全部被執(zhí)行,要么就全部不被執(zhí)行。如果事務的所有子事務全部提交成功,則所有的數(shù)據(jù)庫操作被提交,數(shù)據(jù)庫狀態(tài)發(fā)生轉(zhuǎn)換;如果有子事務失敗,則其他子事務的數(shù)據(jù)庫操作被回滾,即數(shù)據(jù)庫回到事務執(zhí)行前的狀態(tài),不會發(fā)生狀態(tài)轉(zhuǎn)換。
b、一致性
事務的執(zhí)行使得數(shù)據(jù)庫從一種正確狀態(tài)轉(zhuǎn)換成另一種正確狀態(tài)。
c、隔離性
在事務正確提交之前,不允許把該事務對數(shù)據(jù)的任何改變提供給任何其他事務,即在事務正確提交之前,它可能的結(jié)果不應顯示給任何其他事務。
d、持久性
事務正確提交后,其結(jié)果將永久保存在數(shù)據(jù)庫中,即使在事務提交后有了其他故障,事務的處理結(jié)果也會得到保存。
既然事務的概念從數(shù)據(jù)庫而來,那Java事務是什么?之間有什么聯(lián)系?
實際上,一個Java應用系統(tǒng),如果操作數(shù)據(jù)庫,通過JDBC來實現(xiàn)的。那么增加、修改、刪除都是通過相應方法間接來實現(xiàn)的,事務的控制也相應轉(zhuǎn)移到Java程序代碼中。因此,數(shù)據(jù)庫操作的事務習慣上就稱為Java事務。
2、為什么需要事務
簡單一句話:保持數(shù)據(jù)的一致性。
3、Java事務類型
Java事務的類型有三種:JDBC事務、JTA(Java Transaction API)事務、容器事務。這里都是最簡單的介紹,最后還會介紹下jdbc事務的使用,其他兩種大家可以自己搜下學習下。
a、JDBC事務
JDBC 事務是用 Connection 對象控制的。JDBC Connection 接口( java.sql.Connection )提供了兩種事務模式:自動提交和手工提交。 java.sql.Connection 提供了以下控制事務的方法:
public void setAutoCommit(boolean) public boolean getAutoCommit() public void commit() public void rollback()
使用 JDBC 事務界定時,您可以將多個 SQL 語句結(jié)合到一個事務中。JDBC 事務的一個缺點是事務的范圍局限于一個數(shù)據(jù)庫連接。一個 JDBC 事務不能跨越多個數(shù)據(jù)庫。
b、JTA(Java Transaction API)事務
JTA是一種高層的,與實現(xiàn)無關(guān)的,與協(xié)議無關(guān)的API,應用程序和應用服務器可以使用JTA來訪問事務。
JTA允許應用程序執(zhí)行分布式事務處理--在兩個或多個網(wǎng)絡(luò)計算機資源上訪問并且更新數(shù)據(jù),這些數(shù)據(jù)可以分布在多個數(shù)據(jù)庫上。JDBC驅(qū)動程序的JTA支持極大地增強了數(shù)據(jù)訪問能力。
如果計劃用 JTA 界定事務,那么就需要有一個實現(xiàn) javax.sql.XADataSource 、 javax.sql.XAConnection 和 javax.sql.XAResource 接口的 JDBC 驅(qū)動程序。
一個實現(xiàn)了這些接口的驅(qū)動程序?qū)⒖梢詤⑴c JTA 事務。一個 XADataSource 對象就是一個 XAConnection 對象的工廠。 XAConnections 是參與 JTA 事務的 JDBC 連接,您將需要用應用服務器的管理工具設(shè)置 XADataSource 。
J2EE 應用程序用 JNDI 查詢數(shù)據(jù)源。一旦應用程序找到了數(shù)據(jù)源對象,它就調(diào)用 javax.sql.DataSource.getConnection() 以獲得到數(shù)據(jù)庫的連接。
XA 連接與非 XA 連接不同。一定要記住 XA 連接參與了 JTA 事務。這意味著 XA 連接不支持 JDBC 的自動提交功能。同時,應用程序一定不要對 XA 連接調(diào)用 java.sql.Connection.commit() 或者 java.sql.Connection.rollback() 。
相反,應用程序應該使用 UserTransaction.begin()、 UserTransaction.commit() 和 serTransaction.rollback() 。
c、容器事務
容器事務主要是J2EE應用服務器提供的,容器事務大多是基于JTA完成,這是一個基于JNDI的,相當復雜的API實現(xiàn)。相對編碼實現(xiàn)JTA事務管理,我們可以通過EJB容器提供的容器事務管理機制(CMT)完成同一個功能,這項功能由J2EE應用服務器提供。
這使得我們可以簡單的指定將哪個方法加入事務,一旦指定,容器將負責事務管理任務。這是我們土建的解決方式,因為通過這種方式我們可以將事務代碼排除在邏輯編碼之外,同時將所有困難交給J2EE容器去解決。
使用EJB CMT的另外一個好處就是程序員無需關(guān)心JTA API的編碼,不過,理論上我們必須使用EJB。
d、JDBC事務的使用
(1)步驟:
首先,設(shè)置事務的提交方式為非自動提交:conn.setAutoCommit(false);接下來,將需要添加事務的代碼放入try,catch塊中。
然后,在try塊內(nèi)添加事務的提交操作,表示操作無異常,提交事務:conn.commit();尤其不要忘記,在catch塊內(nèi)添加回滾事務,表示操作出現(xiàn)異常,撤銷事務:conn.rollback();最后,設(shè)置事務提交方式為自動提交:conn.setAutoCommit(true);這樣,通過簡單的幾步,我們就可以完成對事務處理的編寫了。
(2)偽代碼:
con = DriverManager.getConnection(url, user, password); String result = ""; String sql1 = ""; // LAST_INSERT_ID() 獲取剛剛插入的自動遞增的ID String sql2 = ""; int flag; try { con.setAutoCommit(false);// 更改JDBC事務的默認提交方式 pstmt = con.prepareStatement(sql1); flag = pstmt.executeUpdate(); if (flag > 0) { pstmt = con.prepareStatement(sql2); int i = pstmt.executeUpdate(); if (i > 0) { con.commit();//提交JDBC事務 result = "add data success!!"; } else { result = "add data fail!!"; } } else { result = "add data fail!!"; } } catch (SQLException e) { try { con.rollback();//回滾JDBC事務 } 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); // 恢復JDBC事務的默認提交方式 } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } return result;
4、三種事務差異
1、JDBC事務控制的局限性在一個數(shù)據(jù)庫連接內(nèi),但是其使用簡單。
2、JTA事務的功能強大,事務可以跨越多個數(shù)據(jù)庫或多個DAO,使用也比較復雜。
3、容器事務,主要指的是J2EE應用服務器提供的事務管理,局限于EJB應用使用。
5、總結(jié)
事務控制是構(gòu)建J2EE應用不可缺少的一部分,合理選擇應用何種事務對整個應用系統(tǒng)來說至關(guān)重要。一般說來,在單個JDBC 連接連接的情況下可以選擇JDBC事務,在跨多個連接或者數(shù)據(jù)庫情況下,需要選擇使用JTA事務,如果用到了EJB,則可以考慮使用EJB容器事務。
關(guān)于JAVA中的事務介紹就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
分享題目:JAVA中的事務介紹
轉(zhuǎn)載源于:http://jinyejixie.com/article10/gdjigo.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站建設(shè)、、定制開發(fā)、微信小程序、移動網(wǎng)站建設(shè)、動態(tài)網(wǎng)站
聲明:本網(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)