當前位置:首頁 » 數據倉庫 » 資料庫事務jdbc
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

資料庫事務jdbc

發布時間: 2022-10-30 20:18:39

① JDBC事務和JTA事務的區別

一、事務概述
事務表示一個由一系列的資料庫操作組成的不可分割的邏輯單位,其中的操作要麼全做要麼全都不做。
與事務相關的操作主要有:
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是單庫的事務

② jdbc的事務和jdbc傳統的crud有什麼區別

在jdbc的資料庫操作中,一項事務是由一條或是多條表達式所組成的一個不可分割的工作單元。我們通過提交commit()或是回滾rollback()來結束事務的操作。關於事務操作的方法都位於介面java.sql.Connection中。

2. 特點:

★ 在jdbc中,事務操作預設是自動提交。也就是說,一條對資料庫的更新表達式代表一項事務操作,操作成功後,系統將自動調用commit()來提交,否則將調用rollback()來回滾。

★ 在jdbc中,可以通過調用setAutoCommit(false)來禁止自動提交。之後就可以把多個資料庫操作的表達式作為一個事務,在操作完成後調用commit()來進行整體提交,倘若其中一個表達式操作失敗,都不會執行到commit(),並且將產生響應的異常;此時就可以在異常捕獲時調用rollback()進行回滾。這樣做可以保持多次更新操作後,相關數據的一致性,示例如下:

try {

conn = DriverManager.getConnection ;

conn.setAutoCommit(false);//禁止自動提交,設置回滾點

stmt = conn.createStatement();

stmt.executeUpdate(「alter table …」); //資料庫更新操作1

stmt.executeUpdate(「insert into table …」); //資料庫更新操作2

conn.commit(); //事務提交

}catch(Exception ex) {

ex.printStackTrace();

try {

conn.rollback(); //操作不成功則回滾

}catch(Exception e) {

e.printStackTrace();

}

}

最後一句話,傳統CRUD就是走一步算一步,事務就是要做一起做,要不就都撤銷。

③ java中的JDBC事務和JTA的區別是什麼

在說他們之間的區別之前,先考慮如下幾個問題:
1、getCurrentSession()與openSession()的區別?
* 採用getCurrentSession()創建的session會綁定到當前線程中,而採用openSession()
創建的session則不會
* 採用getCurrentSession()創建的session在commit或rollback時會自動關閉,而採用openSession()
創建的session必須手動關閉

2、使用getCurrentSession()需要在hibernate.cfg.xml文件中加入如下配置:
* 如果使用的是本地事務(jdbc事務)
<property name="hibernate.current_session_context_class">thread</property>
* 如果使用的是全局事務(jta事務)
<property name="hibernate.current_session_context_class">jta</property>

以上是hibernate中一些使用,下面來說說jdbc與jta的區別:
JDBC 事務
JDBC 事務是用 Connection 對象控制的。JDBC Connection 介面( java.sql.Connection )提供了兩種事務模式:自動提交和手工提交。
#在jdbc中,事務操作預設是自動提交。也就是說,一條對資料庫的更新表達式代表一項事務操作,操作成功後,系統將自動調用commit()來提交,否則將調用rollback()來回滾。
# 在jdbc中,可以通過調用setAutoCommit(false)來禁止自動提交。之後就可以把多個資料庫操作的表達式作為一個事務,在操作完成後調 用commit()來進行整體提交,倘若其中一個表達式操作失敗,都不會執行到commit(),並且將產生響應的異常;此時就可以在異常捕獲時調用 rollback()進行回滾。這樣做可以保持多次更新操作後,相關數據的一致性,示例如下:

try {

conn =

DriverManager.getConnection

("jdbc:oracle:thin:@host:1521:SID","username","userpwd";

conn.setAutoCommit(false);//禁止自動提交,設置回滾點

stmt = conn.createStatement();

stmt.executeUpdate(「alter table …」); //資料庫更新操作1

stmt.executeUpdate(「insert into table …」); //資料庫更新操作2

conn.commit(); //事務提交

}catch(Exception ex) {

ex.printStackTrace();

try {

conn.rollback(); //操作不成功則回滾

}catch(Exception e) {

e.printStackTrace();

}

}

JDBC 事務的一個缺點是事務的范圍局限於一個資料庫連接。一個 JDBC 事務不能跨越多個資料庫。
JTA事務
JTA(Java Transaction API) 為 J2EE 平台提供了分布式事務服務。
要用 JTA 進行事務界定,應用程序要調用 javax.transaction.UserTransaction 介面中的方法。例如:
utx.begin();
// ...
DataSource ds = obtainXADataSource();
Connection conn = ds.getConnection();
pstmt = conn.prepareStatement("UPDATE MOVIES ...");
pstmt.setString(1, "Spinal Tap");
pstmt.executeUpdate();
// ...
utx.commit();

讓我們來關注下面的話:
「用 JTA 界定事務,那麼就需要有一個實現 javax.sql.XADataSource 、 javax.sql.XAConnection 和 javax.sql.XAResource 介面的 JDBC 驅動程序。一個實現了這些介面的驅動程序將可以參與 JTA 事務。一個 XADataSource 對象就是一個 XAConnection 對象的工廠。 XAConnection s 是參與 JTA 事務的 JDBC 連接。」
要使用JTA事務,必須使用XADataSource來產生資料庫連接,產生的連接為一個XA連接。
XA連接(javax.sql.XAConnection)和非XA(java.sql.Connection)連接的區別在於:XA可以參與JTA的事務,而且不支持自動提交。
注意:
Oracle, Sybase, DB2, SQL Server等大型資料庫才支持XA, 支持分布事務。
My SQL 連本地都支持不好,更別說分布事務了。
JTA方式的實現過程:
用XADataSource產生的XAConnection它擴展了一個getXAResource()方法,事務通過這個方法把它加入到事務容器中進行 管理.對於調用者來說,根本看不到事務是如果管理的,你只要聲明開始事務,告訴容器我下面的操作要求事務參與了,最後告訴事務說到這兒可以提交或回滾了, 別的都是黑箱操作。
在使用JTA之前,你必須首先實現一個Xid類用來標識事務(在普通情況下這將由事務管理程序來處理)。Xid包含三個元素:formatID、gtrid(全局事務標識符)和bqual(分支修飾詞標識符)。
下面的例子說明Xid的實現:

import javax.transaction.xa.*;
public class MyXid implements Xid
{
protected int formatId;
protected byte gtrid[];
protected byte bqual[];
public MyXid()
{
}
public MyXid(int formatId, byte gtrid[], byte bqual[])
{
this.formatId = formatId;
this.gtrid = gtrid;
this.bqual = bqual;
}

public int getFormatId()
{
return formatId;
}

public byte[] getBranchQualifier()
{
return bqual;
}

public byte[] getGlobalTransactionId()
{
return gtrid;
}

}
其次,你需要創建一個你要使用的資料庫的數據源:
public DataSource getDataSource()
throws SQLException
{
SQLServerDataSource xaDS = new
com.merant.datadirect.jdbcx.sqlserver.SQLServerDataSource();
xaDS.setDataSourceName("SQLServer");
xaDS.setServerName("server");
xaDS.setPortNumber(1433);
xaDS.setSelectMethod("cursor");
return xaDS;
}

例1 這個例子是用「兩步提交協議」來提交一個事務分支:
XADataSource xaDS;
XAConnection xaCon;
XAResource xaRes;
Xid xid;
Connection con;
Statement stmt;
int ret;
xaDS = getDataSource();
xaCon = xaDS.getXAConnection("jdbc_user", "jdbc_password");
xaRes = xaCon.getXAResource();
con = xaCon.getConnection();
stmt = con.createStatement();
xid = new MyXid(100, new byte[]{0x01}, new byte[]{0x02});
try {
xaRes.start(xid, XAResource.TMNOFLAGS);
stmt.executeUpdate("insert into test_table values (100)");
xaRes.end(xid, XAResource.TMSUCCESS);
ret = xaRes.prepare(xid);
if (ret == XAResource.XA_OK) {
xaRes.commit(xid, false);
}
}
catch (XAException e) {
e.printStackTrace();
}
finally {
stmt.close();
con.close();
xaCon.close();
}
當然,實際過程中,我們不需要寫這些代碼,這些代碼是JTA最終的實現代碼。
關於「兩步提交協議」,可以參看下面的文章:
http://www.ibm.com/developerworks/cn/db2/library/techarticles/dm-0505weber/index.html

兩階段提交(Two-Phase-Commit)協議

首先,兩階段提交(Two-Phase-Commit)事務的啟動與常規的單階段提交(One-Phase-Commit)事務類似。接著,應用程序/客 戶機對該兩階段提交(Two-Phase-Commit)操作中所涉及的所有資料庫執行其修改工作。現在,在最終提交該事務之前,客戶機通知參與的資料庫准備提交(第 1 階段)。如果客戶機從資料庫收到一條「okay」,就發出命令向資料庫提交該事務(第 2 階段)。最後分布式事務(Distributed Transaction)結束。

上面的例子演示了如何在 Java 中使用 JTA 實現兩階段提交(Two-Phase-Commit)協議。在該應用程序中,如果一個事務分支報告了錯誤,您就要負責進行錯誤處理。但是「兩階段提交協議 簡介」小節中提到仍然存在一個問題,那就是如果第 2 階段中一個事務分支發生故障,該怎麼辦呢?

如果再次查看程序代碼,您可以看到在「第 1 階段」和「第 2 階段」之間有一個很小的時間間隔。在這一時間間隔中,出於某種理由,其中某一參與資料庫可能崩潰。如果發生了,我們將陷入分布式事務已經部分提交的情形中。

假 定下列情形:在「第 1 階段」之後,您從 DB2 和 IDS 資料庫中都收到了「okay」。在下一步中,應用程序成功提交了 DB2 的事務分支。接著,應用程序通知 DB2 事務分支提交事務。現在,在應用程序可以通知 IDS 事務分支提交它這一部分之前,IDS 引擎由於斷電發生崩潰。這就是一種部分提交全局事務的情形。您現在該怎麼辦呢?

在重啟之後,DB2 和 IDS 都將嘗試恢復打開的事務分支。該引擎等待來自應用程序的提示如何做。如果應用程序沒有準備重新發送「第 2 階段」的提交,該事務分支將被引擎所啟動的試探性回滾中止。這是非常糟糕的,因為這將使該全局事務處於不一致狀態。

一種解決方案是用一個小型應用程序連接引擎中打開的事務分支,並通知引擎提交或回滾這一打開的事務。如果您使用 IDS 作為後端,那麼還有一個隱藏的 onmode 標志,允許您結束打開的事務分支。(onmode -Z xid)。

在 DB2 UDB 中,您可以發出 LIST INDOUBT TRANSACTIONS 來獲得打開的 XA 事務的有關信息。您必須查看 DB2 Information Center 中的描述來解決該問題。

上面描述的情形是一個很好的例子,也是使用應用程序伺服器(Application Server)或事務監控器(Transaction Monitor)的理由。在使用一個中間層伺服器時,就由該伺服器負責保持事情正常。

④ JDBC的事務,有哪位能詳細解說下

事務是針對原子操作的,要求原子操作不可再分,要求原子操作必須同時成功同時失敗。
事務是捆綁的原子操作的邊界。
JDBC中使用事務,先要使用連接調用setAutoCommite(false)方法,把自動提交(commit)置為false。打開事務就要關閉自動提交。不用事務是要把setAutoCommite(true).
在處理事務時,在發送sql語句後執行成功並確認時,就在try塊中使用連接調用commit()方法來發送提交信息,
在發送sql語句後執行失敗時,會在catch語句塊中使用連接調用rollback()方法來發送回滾信息,也可以在需要時做回滾操作(主觀原因)。
事務隔離級別
TRANSACTION_NONE不使用事務。
TRANSACTION_READ_UNCOMMITTED 可以讀取為提交數據。
TRANSACTION_READ_COMMITTED可以避免臟讀,不能夠讀取沒提交的數據,最常用的隔離級別 大部分資料庫的默認隔離級別
TRANSACTION_REPEATABLE_READ可以避免臟讀,重復讀取,
TRANSACTION_SERIALIZABLE可以避免臟讀,重復讀取和幻讀,(事務串列化)會降低資料庫效率

⑤ 請問jdbc處理事務的時候,為什麼非要保證同一個資料庫鏈接

第一 JDBC是Java中操作資料庫數據的規范,注意是規范和標准,除此之外別無它號,即使Hibernite,Batis 也是要建立在JDBC基礎上的。JDBC定義了如何鏈接資料庫(Connection),如何操作數據(ResultSet,Stement)和事務管理(Transcation ,SavePoint...),JDBC具體的實現是由資料庫廠商或第三方提供。

第二理論上說,不用JDBC也可以直接操作資料庫,但是很多情況下這些東西是無法實現的,比如在鏈接一個資料庫時廠商會對通訊協議中的部分內容保密僅提供資料庫驅動,很難查找到相關的資料,即使有也會涉及到版權這些問題。除此之外上層的數據操作介面也要重新定義和編寫。

第三 其實JDBC 發展到現在 4.X 版本已經很優秀了,畢竟我們沒有必要重新發明輪子

⑥ jdbc如何實現資料庫跨庫事務刪除回滾的問題

1. Connection.setAutoCommit(boolean );//設置自動提交模式,false表示禁用自動提交模式;
2. 用Savepoint對象的setSavapoint(String name);
3 rollback()取消在當前事務中進行的所有更改;
4. rollback (Savepoint )//回退到保存點 狀態;
5. commit ()提交事務;

⑦ jdbc有哪些事務,各個事務特點

事務的:原子性、一致性、分離性、持久性
原子性、一致性、分離性、持久性
(1) 原子性
事務的原子性指的是,事務中包含的程序作為資料庫的邏輯工作單位,它所做的對數據修改操作要麼全部執行,要麼完全不執行。這種特性稱為原子性。
事務的原子性要求,如果把一個事務可看作是一個程序,它要麼完整的被執行,要麼完全不執行。就是說事務的操縱序列或者完全應用到資料庫或者完全不影響資料庫。這種特性稱為原子性。
假如用戶在一個事務內完成了對資料庫的更新,這時所有的更新對外部世界必須是可見的,或者完全沒有更新。前者稱事務已提交,後者稱事務撤消(或流產)。DBMS必須確保由成功提交的事務完成的所有操縱在資料庫內有完全的反映,而失敗的事務對資料庫完全沒有影響。

(2) 一致性
事務的一致性指的是在一個事務執行之前和執行之後資料庫都必須處於一致性狀態。這種特性稱為事務的一致性。假如資料庫的狀態滿足所有的完整性約束,就說該資料庫是一致的。
一致性處理資料庫中對所有語義約束的保護。假如資料庫的狀態滿足所有的完整性約束,就說該資料庫是一致的。例如,當資料庫處於一致性狀態S1時,對資料庫執行一個事務,在事務執行期間假定資料庫的狀態是不一致的,當事務執行結束時,資料庫處在一致性狀態S2。

(3) 分離性
分離性指並發的事務是相互隔離的。即一個事務內部的操作及正在操作的數據必須封鎖起來,不被其它企圖進行修改的事務看到。
分離性是DBMS針對並發事務間的沖突提供的安全保證。DBMS可以通過加鎖在並發執行的事務間提供不同級別的分離。假如並發交叉執行的事務沒有任何控制,操縱相同的共享對象的多個並發事務的執行可能引起異常情況。
DBMS可以在並發執行的事務間提供不同級別的分離。分離的級別和並發事務的吞吐量之間存在反比關系。較多事務的可分離性可能會帶來較高的沖突和較多的事務流產。流產的事務要消耗資源,這些資源必須要重新被訪問。因此,確保高分離級別的DBMS需要更多的開銷。

(4)持久性
持久性意味著當系統或介質發生故障時,確保已提交事務的更新不能丟失。即一旦一個事務提交,DBMS保證它對資料庫中數據的改變應該是永久性的,耐得住任何系統故障。持久性通過資料庫備份和恢復來保證。
持久性意味著當系統或介質發生故障時,確保已提交事務的更新不能丟失。即對已提交事務的更新能恢復。一旦一個事務被提交,DBMS必須保證提供適當的冗餘,使其耐得住系統的故障。所以,持久性主要在於DBMS的恢復性能。

⑧ 關於jdbc中資料庫事務的提交和回滾

首先,連接資料庫異常,可能是資料庫JDBC連接問題,也可能是驅動問題。
第二,沒找到資料庫
第三,資料庫欄位拼寫錯誤。
第四,SQL語句錯誤
第五,還沒發現。呵呵。這個是我最近2天遇到的問題。。。都在這里啦。。