国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發(fā)設(shè)計 > 正文

Java中數(shù)據(jù)庫事務(wù)處理的實現(xiàn)

2019-11-17 05:55:33
字體:
供稿:網(wǎng)友
  摘要 本文介紹在java中進行事務(wù)處理的方法,通過實例分別講述了如何采用JavaBean、Ejb組件實現(xiàn)J2EE應(yīng)用服務(wù)器支持的JDBC事務(wù)、JTA(Java Transaction API)事務(wù)。

  要害詞 JavaBean,EJB, 數(shù)據(jù)庫,事務(wù)處理,JTA  JavaBean

  JavaBean是用Java語言編寫的與平臺無關(guān)的組件。它是描述Java的軟件組件模型,有點類似于Microsoft的COM組件的概念。在Java模型中,通過JavaBean可以無限擴充Java程序的功能,通過JavaBean的組合可以快速的生成新的應(yīng)用程序。JavaBean可以實現(xiàn)代碼的重復利用,對于程序的易維護性也有重大的意義。非可視化的JavaBean,在jsp程序中常用來封裝事務(wù)邏輯、數(shù)據(jù)庫操作等,可以很好的實現(xiàn)業(yè)務(wù)邏輯和前臺程序的分離。JavaBean在服務(wù)器端的應(yīng)用方面表現(xiàn)出了越來越強的生命力。

  EJB

  EJB技術(shù)定義了一組可重用的組件:EnterPRise JavaBeans。你可以利用這些組件,像搭積木一樣的建立你的分布式應(yīng)用程序。當你把代碼寫好之后,這些組件就被組合到特定的文件中去。每個文件有一個或多個Enterprise Beans,在加上一些配置參數(shù)。最后,這些Enterprise Beans被配置到一個裝了EJB容器的平臺上。客戶能夠通過這些Beans的home接口,定位到某個beans,并產(chǎn)生這個beans的一個實例。這樣,客戶就能夠調(diào)用Beans的應(yīng)用方法和遠程接口。EJB技術(shù)簡化了用JAVA語言編寫的企業(yè)應(yīng)用系統(tǒng)的開發(fā)、配置和執(zhí)行。有三種類型的Enterprise beans: session beans、 entity beans和Message-driven Beans。

  事務(wù)處理

  信息是任何企事業(yè)單位的重要資產(chǎn),任何企業(yè)部門都包含著信息的流入、流出,任何企業(yè)部門都控制著某些信息。同時,信息必須在適當?shù)臅r機傳播給需要的人。而且,信息還需要安全約束,通常根據(jù)信息的類型和內(nèi)容實施訪問控制。為了保證數(shù)據(jù)的安全有效和正確可靠,數(shù)據(jù)庫治理系統(tǒng)(DBMS)必須提供統(tǒng)一的數(shù)據(jù)保護功能。

  事務(wù)是現(xiàn)代數(shù)據(jù)庫理論中的核心概念之一。假如一組處理步驟或者全部發(fā)生或者一步也不執(zhí)行,我們稱該組處理步驟為一個事務(wù)。當所有的步驟像一個操作一樣被完整地執(zhí)行,我們稱該事務(wù)被提交。由于其中的一部分或多步執(zhí)行失敗,導致沒有步驟被提交,則事務(wù)必須回滾(回到最初的系統(tǒng)狀態(tài))。事務(wù)必須服從ISO/IEC所制定的ACID原則。ACID是原子性(atomicity)、一致性(consistency)、隔離性(isolation)和持久性(durability)的縮寫。事務(wù)的原子性表示事務(wù)執(zhí)行過程中的任何失敗都將導致事務(wù)所做的任何修改失效。一致性表示當事務(wù)執(zhí)行失敗時,所有被該事務(wù)影響的數(shù)據(jù)都應(yīng)該恢復到事務(wù)執(zhí)行前的狀態(tài)。隔離性表示在事務(wù)執(zhí)行過程中對數(shù)據(jù)的修改,在事務(wù)提交之前對其他事務(wù)不可見。持久性表示已提交的數(shù)據(jù)在事務(wù)執(zhí)行失敗時,數(shù)據(jù)的狀態(tài)都應(yīng)該正確。

  在下面我們列舉一個使用SQL Server數(shù)據(jù)庫進行事務(wù)處理的例子。主表是一個規(guī)章制度信息表(bylaw),主要字段有記錄編號、標題、作者、書寫日期等。兩個子表分別是附件表(bylaw_affix)和文本信息表(bylaw_content)。表結(jié)構(gòu)見圖1所示。bylaw表的記錄編號與bylaw_affix表的記錄編號、bylaw_content表的記錄編號是對應(yīng)的,每次對規(guī)章制度信息的操作也就是對這三個表的聯(lián)合操作。例如要刪除規(guī)章制度中的一條記錄,假如不使用事務(wù),就可能會出現(xiàn)這樣的情況:第一個表中成功刪除后,數(shù)據(jù)庫忽然出現(xiàn)意外狀況,而第二、三個表中的操作沒有完成,這樣,刪除操作并沒有完成,甚至已經(jīng)破壞數(shù)據(jù)庫中的數(shù)據(jù)。要避免這種情況,就應(yīng)該使用事務(wù),它的作用是:要么三個表都操作成功,要么都失敗。換句話說,就是保持數(shù)據(jù)的一致性。所以,為了確保對數(shù)據(jù)操作的完整和一致,在程序設(shè)計時要充分考慮到事務(wù)處理方面的問題。

Java中數(shù)據(jù)庫事務(wù)處理的實現(xiàn)
圖1 示例表結(jié)構(gòu)

  Java中的事務(wù)處理

  一般情況下,J2EE應(yīng)用服務(wù)器支持JDBC事務(wù)、JTA(Java Transaction API)事務(wù)、容器治理事務(wù)。一般情況下,最好不要在程序中同時使用上述三種事務(wù)類型,比如在JTA事務(wù)中嵌套JDBC事務(wù)。
第二方面,事務(wù)要在盡可能短的時間內(nèi)完成,不要在不同方法中實現(xiàn)事務(wù)的使用。下面我們列舉兩種事務(wù)處理方式。

  1、JavaBean中使用JDBC方式進行事務(wù)處理


  在JDBC中怎樣將多個SQL語句組合成一個事務(wù)呢?在JDBC中,打開一個連接對象Connection時,缺省是auto-commit模式,每個SQL語句都被當作一個事務(wù),即每次執(zhí)行一個語句,都會自動的得到事務(wù)確認。為了能將多個SQL語句組合成一個事務(wù),要將auto-commit模式屏蔽掉。在auto-commit模式屏蔽掉之后,假如不調(diào)用commit()方法,SQL語句不會得到事務(wù)確認。在最近一次commit()方法調(diào)用之后的所有SQL會在方法commit()調(diào)用時得到確認。

public int delete(int sID) {
 dbc = new DataBaseConnection();
 Connection con = dbc.getConnection();
 try {
  con.setAutoCommit(false);// 更改JDBC事務(wù)的默認提交方式
  dbc.executeUpdate("delete from bylaw where ID=" + sID);
  dbc.executeUpdate("delete from bylaw _content where ID=" + sID);
  dbc.executeUpdate("delete from bylaw _affix where bylawid=" + sID);
  con.commit();//提交JDBC事務(wù)
  con.setAutoCommit(true);// 恢復JDBC事務(wù)的默認提交方式
  dbc.close();
  return 1;
 }
 catch (Exception exc) {
  con.rollBack();//回滾JDBC事務(wù)
  exc.printStackTrace();
  dbc.close();
  return -1;
 }
}
  2、SessionBean中的JTA事務(wù)

  JTA 是事務(wù)服務(wù)的 J2EE 解決方案。本質(zhì)上,它是描述事務(wù)接口(比如 UserTransaction 接口,開發(fā)人員直接使用該接口或者通過 J2EE 容器使用該接口來確保業(yè)務(wù)邏輯能夠可靠地運行)的 J2EE 模型的一部分。JTA 具有的三個主要的接口分別是 UserTransaction 接口、TransactionManager 接口和 Transaction 接口。這些接口共享公共的事務(wù)操作,例如 commit() 和 rollback(), 但是也包含非凡的事務(wù)操作,例如 suspend(),resume() 和 enlist(),它們只出現(xiàn)在特定的接口上,以便在實現(xiàn)中答應(yīng)一定程度的訪問控制。例如,UserTransaction 能夠執(zhí)行事務(wù)劃分和基本的事務(wù)操作,而 TransactionManager 能夠執(zhí)行上下文治理。

  應(yīng)用程序可以調(diào)用UserTransaction.begin()方法開始一個事務(wù),該事務(wù)與應(yīng)用程序正在其中運行的當前線程相關(guān)聯(lián)。底層的事務(wù)治理器實際處理線程與事務(wù)之間的關(guān)聯(lián)。UserTransaction.commit()方法終止與當前線程關(guān)聯(lián)的事務(wù)。UserTransaction.rollback()方法將放棄與當前線程關(guān)聯(lián)的當前事務(wù)。

public int delete(int sID) {
 DataBaseConnection dbc = null;
 dbc = new DataBaseConnection();
 dbc.getConnection();
 UserTransaction transaction = sessionContext.getUserTransaction();//獲得JTA事務(wù)
 try {
  transaction.begin(); //開始JTA事務(wù)
  dbc.executeUpdate("delete from bylaw where ID=" + sID);
  dbc.executeUpdate("delete from bylaw _content where ID=" + sID);
  dbc.executeUpdate("delete from bylaw _affix where bylawid=" + sID);
  transaction.commit(); //提交JTA事務(wù)
  dbc.close();
  return 1;
 }
 catch (Exception exc) {
  try {
   transaction.rollback();//JTA事務(wù)回滾
  }
  catch (Exception ex) {
   //JTA事務(wù)回滾出錯處理
   ex.printStackTrace();
  }
  exc.printStackTrace();
  dbc.close();
  return -1;
 }
}

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 长泰县| 上饶市| 佛坪县| 云林县| 沛县| 麻栗坡县| 金川县| 临漳县| 永福县| 商丘市| 图木舒克市| 古蔺县| 垣曲县| 连云港市| 屯昌县| 神农架林区| 阜宁县| 蛟河市| 苏尼特右旗| 武夷山市| 临西县| 宁都县| 叶城县| 静宁县| 青川县| 安远县| 河曲县| 西平县| 太康县| 富阳市| 积石山| 宝山区| 利津县| 周口市| 涞水县| 辰溪县| 酉阳| 博湖县| 绥芬河市| 灵武市| 沂水县|