1、什麼是Java事務
#通常觀念認為,交易與資料庫有關。事務是存取資料庫的操作序列,資料庫應用系統透過事務集來完成對資料庫的存取。事務的正確執行使得資料庫從一種狀態轉換成另一種狀態。
事務必須服從ISO/IEC所訂定的ACID原則。
ACID是原子性(atomicity)、一致性(consistency)、隔離性(isolation)和持久性(durability)的縮寫事務必須服從ISO/IEC所製定的ACID原則。 ACID是原子性(atomicity)、一致性(consistency)、隔離性(isolation)和持久性(durability)的縮寫。
a、原子性
即不可分割性,事務要麼全部被執行,要麼就全部不被執行。如果交易的所有子事務全部提交成功,則所有的資料庫操作被提交,資料庫狀態發生轉換;如果有子事務失敗,則其他子事務的資料庫操作被回滾,即資料庫回到事務執行前的狀態,不會發生狀態轉換。
b、一致性
交易的執行使得資料庫從一種正確狀態轉換成另一種正確狀態。
c、隔離性
在交易正確提交之前,不允許把該事務對資料的任何變更提供給任何其他事務,即在事務正確提交之前,它可能的結果不應顯示給任何其他事務。
d、持久性
交易正確提交後,其結果將永久保存在資料庫中,即使在交易提交後有了其他故障,事務的處理結果也會被保存。
既然事務的概念從資料庫而來,那Java事務是什麼?之間有什麼關聯?
實際上,一個Java應用系統,如果操作資料庫,透過JDBC來實現的。那麼增加、修改、刪除都是透過對應方法間接來實現的,事務的控制也隨之轉移到Java程式碼中。因此,資料庫操作的事務習慣上就稱為Java事務。
2、為什麼需要交易
簡單一句話:保持資料的一致性。
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 語句結合到一個交易中。 JDBC 交易的一個缺點是交易的範圍侷限於一個資料庫連線。一個 JDBC 交易不能跨越多個資料庫。
b、JTA(Java Transaction API)事務
JTA是一種高層的,與實作無關的,與協定無關的API,應用程式和應用程式伺服器可以使用JTA來存取事務。
JTA允許應用程式執行分散式事務處理--在兩個或多個網路電腦資源上存取並且更新數據,這些數據可以分佈在多個資料庫上。 JDBC驅動程式的JTA支援大大增強了資料存取能力。
如果計畫用 JTA 界定事務,那麼就需要有一個實作 javax.sql.XADataSource 、 javax.sql.XAConnection 和 javax.sql.XAResource 介面的 JDBC 驅動程式。
一個實作了這些介面的驅動程式將可以參與 JTA 事務。一個 XADataSource 物件就是一個 XAConnection 物件的工廠。 XAConnections 是參與 JTA 交易的 JDBC 連接,您將需要以應用程式伺服器的管理工具設定 XADataSource 。
J2EE 應用程式以 JNDI 查詢資料來源。一旦應用程式找到了資料來源對象,它就會呼叫 javax.sql.DataSource.getConnection() 以獲得到資料庫的連線。
XA 連線與非 XA 連線不同。一定要記住 XA 連線參與了 JTA 事務。這意味著 XA 連線不支援 JDBC 的自動提交功能。同時,應用程式一定不要對 XA 連線呼叫 java.sql.Connection.commit() 或 java.sql.Connection.rollback() 。
相反,應用程式應該使用 UserTransaction.begin()、 UserTransaction.commit() 和 serTransaction.rollback() 。
c、容器事務
容器事務主要是J2EE應用伺服器提供的,容器事務大多是基於JTA完成,這是一個基於JNDI的,相當複雜的API實作。相對編碼實作JTA事務管理,我們可以透過EJB容器提供的容器事務管理機制(CMT)完成同一個功能,這項功能由J2EE應用伺服器提供。
這使得我們可以簡單的指定將哪個方法加入事務,一旦指定,容器將負責事務管理任務。這是我們土建的解決方式,因為透過這種方式我們可以將事務代碼排除在邏輯編碼之外,同時將所有困難交給J2EE容器去解決。
使用EJB CMT的另外一个好处就是程序员无需关心JTA API的编码,不过,理论上我们必须使用EJB。
d、JDBC事务的使用
(1)步骤:
首先,设置事务的提交方式为非自动提交:conn.setAutoCommit(false);接下来,将需要添加事务的代码放入try,catch块中。
然后,在try块内添加事务的提交操作,表示操作无异常,提交事务:conn.commit();尤其不要忘记,在catch块内添加回滚事务,表示操作出现异常,撤销事务:conn.rollback();最后,设置事务提交方式为自动提交: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事务控制的局限性在一个数据库连接内,但是其使用简单。
2、JTA事务的功能强大,事务可以跨越多个数据库或多个DAO,使用也比较复杂。
3、容器事务,主要指的是J2EE应用服务器提供的事务管理,局限于EJB应用使用。
5、总结
事务控制是构建J2EE应用不可缺少的一部分,合理选择应用何种事务对整个应用系统来说至关重要。一般说来,在单个JDBC 连接连接的情况下可以选择JDBC事务,在跨多个连接或者数据库情况下,需要选择使用JTA事务,如果用到了EJB,则可以考虑使用EJB容器事务。
更多相关知识请关注java基础教程栏目
以上是JAVA中的事務處理的詳細內容。更多資訊請關注PHP中文網其他相關文章!