java中的數據庫事務處理


/*java使用事務處理,首先要求數據庫支持事務,如使用MYSQL的事務功能,
就要求mysql的表類型為Innodb,*/
/*InnoDB,是MySQL的數據庫引擎之一
與傳統的ISAM與MyISAM相比,InnoDB的最大特色就是支持了
ACID兼容的事務(Transaction)功能,類似於PostgreSQL。*/
//Java事務的類型有三種:JDBC事務、JTA(Java Transaction API)事務、容器事務。

 

// 1、JDBC事務--------java.sql.Connection(JDBC接口)提供了兩種事務模式,自動提交和手動提交,

/* 自動提交:在做記錄更新時,系統會自動提交,不能保持事務的一致性,也就不能保證數據完整。
  手動提交:它則把事務處理將由你來完成,在發生異常時,可以進行事務回滾,保持事務的一致。
  下面討論下在實踐中的應用區別:
  1、在JDBC中,如果Connection類的方法setAutoCommit(boolean autoCommit)賦給值為false,那么就可以手動提交(調用Connection類的commit()方法);
  2、如果為true那么就是自動提交。自動提交不用你掛念最后要提交的問題,他會自動完成,並且每條語句被當成一個事務;
  3、手動提交,在你顯示提交之前的所有語句都被認為是一個事務,它的好處是,當這個事務中的某一條語句失敗時,事務會回滾,也就是都不會寫到數據庫,這有利於於保持數據庫的一致性。
  比如當你在主表和從表同時插入相關的數據時,如果從表(或主表)失敗,而主表(或從表)成功時,那么,數據也不會被寫入主表(或從表)中。

*/

// java.sqk.Connection提供了下面了下面幾種控制事務的方法
public void setAutoCommit(boolean)

public boolean getAutoCommit()

public void commit()

public void rollback()


/*在JDBC api中,默認的情況為自動提交事務,也就是說,每一條對數據庫的更新的sql語句代表一項事務,操作成功
后,系統自動調用commit()來提交,否則就是調用rollback()來撤銷事務
使用JDBC事務界定時,可以將多個SQL語句結合到一個事務中,JDBC事務的一個缺點是事務的范圍局限在一個數據庫
連接,一個JDBC事務不能跨越多個數據庫*/
public int delete(int sID){
dbc=new DataBaseConnection();
Connection con=dbc.getConnection();
try{
con.setAutoCommit(false); //be set as false to avoid auto commit
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();//commit the transaction;
con.setAutoCommit(true); //恢復JDBC事務的默認提交方式
dbc.close();
return 1;

}catch(Exception exe){
con.rollback(); //rollback the JDBC transaction
exe.printStackTrace();
dbc.close();
return -1;
}

}
//JTA(Java Transaction API)事務
/* JTA是一種高層的,與實現無關的,與協議無關的API,應用程序和應用服務器可以使用JTA來訪問事務,
JTA允許應用程序執行分布式事務處理--在兩個或多個網絡計算機資源上訪問並且更新數據,這些數據
可以分布在多個數據庫上.JDBC驅動程序的JTA支持極大地增強了數據訪問能力.
如果計划用JTA界定事務,那么就需要有一個實現javax.sql.XADataSource、javax.sql.XAConnection
和javax.sql.XAResource接口的JDBC驅動程序。一個實現了這些接口的驅動程序將可以參與JTA事務的
JDBC連接.
需要用應用服務器的管理工具設置XADataSource,從應用服務器和JDBC驅動程序的文檔中可以了解到
相關的指導。
J2EE應用程序用JNDI查詢數據源,一旦應用程序找到了數據對象,它就調用javax.sql.DataSource.getConnection.commit()
或者java.sql.Connection.rollback().
相反,應用程序應該使用 UserTransaction.begin()、 UserTransaction.commit() 和 serTransaction.rollback() .

 


*/
/*//3、容器事務

  容器事務主要是J2EE應用服務器提供的,容器事務大多是基於JTA完成,這是一個基於JNDI的,相當復雜的API實現。
相對編碼實現JTA 事務管理,我們可以通過EJB容器提供的容器事務管理機制(CMT)完成同一個功能,這項功能由J2EE
應用服務器提供。這使得我們可以簡單的指定將哪個方法加入事務,一旦指定,容器將負責事務管理任務。這是我們土建
的解決方式,因為通過這種方式我們可以將事務代碼排除在邏輯編碼之外,同時將所有困難交給 J2EE容器去解決。
使用EJB CMT的另外一個好處就是程序員無需關心JTA API的編碼,不過,理論上我們必須使用EJB.*/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM