一、事務概述
事務表示一個由一系列的數據庫操作組成的不可分割的邏輯單位,其中的操作要么全做要么全都不做。
與事務相關的操作主要有:
BEGIN TRANSACTION; 開始一個事務,方法是:begin()
COMMIT; 提交一個事務,方法是:commit()
ROLLBACK; 回滾一個事務,方法是:rollback()
PREPARE; 准備提交一個事務,方法是:prepare()
二、事務的特性(ACID)
1、原子性:同一個事務的操作要么全部成功執行,要么全部撤消
2、隔離性:事務的所有操作不會被其它事務干擾
3、一致性:在操作過程中不會破壞數據的完整性
4、時效性 :事務的結果必須持久保存於介質上
三、事務處理方式
在JDBC連接中,使用命令聲明事務的開始、提交和取消。如前一章介紹的數據庫處理方式,它通過java.sql.Connection接口實現,可以啟用AutoCommit。這種方式使用簡單,但性能較低。
利用JavaEE規范的JTA驅動程序。這種方式性能更好,是EJB和JMS的常用方式。
Java EE 的分布式事務服務包括5個層次:事務管理器、應用服務器、資源管理器、應用程序、通信資源管理器。
事務管理器:完成事務管理
應用服務器:為應用提供服務
資源管理器:連接相應的資源
應 用程 序:需要使用事務的應用
通信資源管理器:接收事務、傳播事務
四、JDBC和JTA事務區別
簡單的說 jta是多庫的事務 jdbc是單庫的事務
1、jdbc事務
JDBC事務由Connnection對象控制管理,也就是說,事務管理實際上是在JDBC Connection中實現。事務周期限於Connection的生命周期。JDBC Connection 接口( java.sql.Connection )提供了兩種事務模式:自動提交和手工提交。
自動提交:缺省是自動提交。一條對數據庫的更新(增/刪/改)代表一項事務操作,操作成功后,系統將自動調用commit()來提交,否則將調用rollback()來回滾。
手工提交:通過調用setAutoCommit(false)來禁止自動提交。這樣就可把多個數據庫操作的表達式作為一個事務,在操作完成后調 用commit()來進行整體提交,其中任何一個操作失敗,都不會執行到commit(),並產生異常;此時可在異常捕獲時調用rollback()進行回滾,以保持多次更新操作后,相關數據的一致性,示例如下:
try {
conn =DriverManager.getConnection(...);
conn.setAutoCommit(false);//禁止自動提交,設置回滾點
stmt = conn.createStatement();
stmt.executeUpdate(...); //數據庫更新操作1
stmt.executeUpdate(...); //數據庫更新操作2
conn.commit(); //事務提交
}catch(Exception ex) {
log.error(...);
try {
conn.rollback(); //操作不成功則回滾
}catch(Exception e) {
log.error(...);
}
}
JDBC 事務的一個缺點是事務的范圍局限於一個數據庫連接。一個 JDBC 事務不能跨越多個數據庫。
2、jta事務
JTA(Java Transaction API)提供了跨數據庫連接(或其他JTA資源)的事務管理能力。JTA事務管理則由JTA容器實現,J2ee框架中事務管理器與應用程序,資源管理器,以及應用服務器之間的事務通訊。
1)JTA的構成
a、高層應用事務界定接口,供事務客戶界定事務邊界的
b、X/Open XA協議(資源之間的一種標准化的接口)的標准Java映射,它可以使事務性的資源管理器參與由外部事務管理器控制的事務中
c、高層事務管理器接口,允許應用程序服務器為其管理的應用程序界定事務的邊界
2)JTA的主要接口
位於javax.transaction包中
a、UserTransaction接口:讓應用程序得以控制事務的開始、掛起、提交、回滾等。由Java客戶端程序或EJB調用。
b、TransactionManager 接口:用於應用服務器管理事務狀態
c、Transaction接口:用於執行相關事務操作
d、XAResource接口:用於在分布式事務環境下,協調事務管理器和資源管理器的工作
e、Xid接口:為事務標識符的Java映射
注:前3個接口位於Java EE版的類庫 javaee.jar 中,Java SE中沒有提供!UserTransaction是編程常用的接口
注意的是JTA只提供了接口,沒有具體的實現。
JTS(Java Transaction Service)是服務OTS的JTA的實現。簡單的說JTS實現了JTA接口,並且符合OTS的規范。
JTA的事務周期可橫跨多個JDBC Connection生命周期,對眾多Connection進行調度,實現其事務性要求。
JTA可以處理任何提供符合XA接口的資源。包括:JDBC連接,數據庫,JMS,商業對象等等。
3)JTA編程的基本步驟
a、首先配置JTA ,建立相應的數據源
b、建立事務:通過創建UserTransaction類的實例來開始一個事務。代碼如下:
Context ctx = new InitialContext(p) ;
UserTransaction trans = (UserTransaction) ctx.lookup("javax. Transaction.UserTransaction")
c、開始事務:代碼為 trans.begin() ;
d、找出數據源:從Weblogic Server上找到數據源,代碼如下:
DataSource ds = (DataSource) ctx.lookup(“mysqldb") ;
e、建立數據庫連接:Connection mycon = ds.getConnection() ;
f、執行SQL操作:stmt.executeUpdate(sqlS);
g、完成事務:trans.commit(); / trans.rollback();
h、關閉連接:mycon.close() ;