Ⅰ jdbc事務回滾java操作
事務控制,一起提交或回滾。
Connection
conn
=
....
//
取得資料庫連接;
conn.setAutoCommit(false);
//
關閉自動提交;
try{
......
//
你的處理數據代碼.
conn.commit();
//
提交事務.
}catch(Exception
ex){
conn.rollback();
//
失敗回滾.
}
Ⅱ Java裡面的JDBC是什麼意思啊
Java資料庫連接是Java語言中用來規范客戶端程序如何來訪問資料庫的應用程序介面,提供了諸如查詢和更新資料庫中數據的方法。JDBC也是Sun Microsystems的商標。我們通常說的JDBC是面向關系型資料庫的。
這種類型的驅動把所有JDBC的調用傳遞給ODBC,再讓後者調用資料庫本地驅動代碼(也就是資料庫廠商提供的資料庫操作二進制代碼庫,例如Oracle中的oci.dll)。
API概述
JDBC API主要位於JDK中的java.sql包中(之後擴展的內容位於javax.sql包中),主要包括(斜體代表介面,需驅動程序提供者來具體實現):
DriverManager:負責載入各種不同驅動程序(Driver),並根據不同的請求,向調用者返回相應的資料庫連接(Connection)。Driver:驅動程序,會將自身載入到DriverManager中去,並處理相應的請求並返回相應的資料庫連接(Connection)。Connection:資料庫連接,負責與進行資料庫間通訊,SQL執行以及事務處理都是在某個特定Connection環境中進行的。
可以產生用以執行SQL的Statement。Statement:用以執行SQL查詢和更新(針對靜態SQL語句和單次執行)。PreparedStatement:用以執行包含動態參數的SQL查詢和更新(在伺服器端編譯,允許重復執行以提高效率)。CallableStatement:
用以調用資料庫中的存儲過程。SQLException:代表在資料庫連接的建立和關閉和SQL語句的執行過程中發生了例外情況(即錯誤)。
Ⅲ JAVA-JDBC連接資料庫一個問題:我採用通過事務提交添加屬性值,為什麼沒有雖然沒有添加,但是ID自動增加
首先自增ID本來就被設計成為不參與資料庫事務的,原因是什麼呢?為了防止ID生成阻塞和防止ID錯亂,因為對了一張表來說,不是只有你一個線程在申請ID,其他的新增線程了也在申請ID,假設你在事務中第一次申請到了ID=1,但這時你的事務並沒提交,也就是這個等於1的ID現在並沒有真正入庫,想想這時別人的進程也去申請同一個表的ID時,ID生成器該給他1還是2?當然是2啦!如果你這時你回滾你的事務,假設事務把ID=1回滾了,給回ID生成器,ID生成器還能把它給出去別人用么?肯定不行啦,為啥,如果這時那個上次拿到2的線程這次又去拿,不是要拿到1了?說好的自增呢?!也許你會說可以等你下次申請ID時給你呀,把3給剛剛那個拿了2的呀,不好意思,資料庫會話(SqlSession)一關,誰記得你呀!
Ⅳ jdbc mybatis hibernate 怎麼開啟關閉事務
JDBC使用Connection控制事務,它有如下方法:
setAutoCommit(false):開啟事務,
commit:提交事務
rollback:回滾事務
--------------------------手動分割線------------------------
MyBatis使用SqlSession控制事務,它提供如下方法
commit:提交事務
rollback:回滾事務
--------------------------手動分割線------------------------
Hibernate使用Tranaction控制事務,提供如下方法
commit:提交事務
rollback:回滾事務
它調用Session的beginTransaction()方法開始事務
但實際開發時都使用Spring 聲明式事務來做事務管理,其實這些內容建議你還是要系統學習一下,可以照著「輕量級java web企業應用實戰」這本書學習,內容很詳細、具體
Ⅳ 在java中,事務是什麼有什麼用!
一、什麼是Java事務
通常的觀念認為,事務僅與資料庫相關。
事務必須服從ISO/IEC所制定的ACID原則。ACID是原子性(atomicity)、一致性(consistency)、隔離性
(isolation)和持久性(rability)的縮寫。事務的原子性表示事務執行過程中的任何失敗都將導致事務所做的任何修改失效。一致性表示
當事務執行失敗時,所有被該事務影響的數據都應該恢復到事務執行前的狀態。隔離性表示在事務執行過程中對數據的修改,在事務提交之前對其他事務不可見。持
久性表示已提交的數據在事務執行失敗時,數據的狀態都應該正確。
通俗的理解,事務是一組原子操作單元,從資料庫角度說,就是一組SQL指令,要麼全部執行成功,若因為某個原因其中一條指令執行有錯誤,則撤銷先前執行過的所有指令。更簡答的說就是:要麼全部執行成功,要麼撤銷不執行。
既然事務的概念從資料庫而來,那Java事務是什麼看之間有什麼聯系看
實際上,一個Java應用系統,如果要操作資料庫,則通過JDBC來實現的。增加、修改、刪除都是通過相應方法間接來實現的,事務的控制也相應轉移到Java程序代碼中。因此,資料庫操作的事務習慣上就稱為Java事務。
二、為什麼需要事務
事務是為解決數據安全操作提出的,事務控制實際上就是控制數據的安全訪問。具一個簡單例子:比如銀行轉帳業務,賬戶A要將自己賬戶上的1000元
轉到B賬戶下面,A賬戶余額首先要減去1000元,然後B賬戶要增加1000元。假如在中間網路出現了問題,A賬戶減去1000元已經結束,B因為網路中
斷而操作失敗,那麼整個業務失敗,必須做出控制,要求A賬戶轉帳業務撤銷。這才能保證業務的正確性,完成這個操走就需要事務,將A賬戶資金減少和B賬戶資
金增加方到一個事務裡面,要麼全部執行成功,要麼操作全部撤銷,這樣就保持了數據的安全性。
三、Java事務的類型
Java事務的類型有三種:JDBC事務、JTA(Java Transaction API)事務、容器事務。
1、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 事務不能跨越多個資料庫。
2、JTA(Java Transaction API)事務
JTA是一種高層的,與實現無關的,與協議無關的API,應用程序和應用伺服器可以使用JTA來訪問事務。
JTA允許應用程序執行分布式事務處理–在兩個或多個網路計算機資源上訪問並且更新數據,這些數據可以分布在多個資料庫上。JDBC驅動程序的JTA支持極大地增強了數據訪問能力。
如果計劃用 JTA 界定事務,那麼就需要有一個實現 javax.sql.XADataSource 、
javax.sql.XAConnection 和 javax.sql.XAResource 介面的 JDBC
驅動程序。一個實現了這些介面的驅動程序將可以參與 JTA 事務。一個 XADataSource 對象就是一個 XAConnection
對象的工廠。 XAConnection s 是參與 JTA 事務的 JDBC 連接。
您將需要用應用伺服器的管理工具設置 XADataSource 。從應用伺服器和 JDBC 驅動程序的文檔中可以了解到相關的指導。
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() 。
3、容器事務
容器事務主要是J2EE應用伺服器提供的,容器事務大多是基於JTA完成,這是一個基於JNDI的,相當復雜的API實現。相對編碼實現JTA事
務管理,我們可以通過EJB容器提供的容器事務管理機制(CMT)完成同一個功能,這項功能由J2EE應用伺服器提供。這使得我們可以簡單的指定將哪個方
法加入事務,一旦指定,容器將負責事務管理任務。這是我們土建的解決方式,因為通過這種方式我們可以將事務代碼排除在邏輯編碼之外,同時將所有困難交給
J2EE容器去解決。使用EJB CMT的另外一個好處就是程序員無需關心JTA API的編碼,不過,理論上我們必須使用EJB。
四、三種事務差異
1、JDBC事務控制的局限性在一個資料庫連接內,但是其使用簡單。
2、JTA事務的功能強大,事務可以跨越多個資料庫或多個DAO,使用也比較復雜。
3、容器事務,主要指的是J2EE應用伺服器提供的事務管理,局限於EJB應用使用。
五、總結
事務控制是構建J2EE應用不可缺少的一部分,合理選擇應用何種事務對整個應用系統來說至關重要。一般說來,在單個JDBC
連接連接的情況下可以選擇JDBC事務,在跨多個連接或者資料庫情況下,需要選擇使用JTA事務,如果用到了EJB,則可以考慮使用EJB容器事務。
如果滿意請及時~~,謝謝~
Ⅵ 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)的理由。在使用一個中間層伺服器時,就由該伺服器負責保持事情正常。
Ⅷ java 啟動jdbc 事務報錯 嵌套異常
這個……「Could not get JDBC Connection」和「Cannot load JDBC driver class」,很明顯是找不到驅動器類。一般是因為伺服器下沒有相應jar,不過看那一堆亂碼……有可能是解碼格式的問題(沒遇到過),而且是用spring載入的(?),多半是解碼問題,把類名加密了。
Ⅸ JAVA中的通過JDBC事務批量提交的問題,我的代碼如下,問題是不回滾.大神幫我看看什麼原因
getPreparedStatement(conn,sql,item);
方法是幹啥的,貼出來
其實問題很簡單
MyLog.e(">>>提交之前<<<");
//在try塊內添加事務的提交操作,表示操作無異常,提交事務。
conn.commit();//此處都沒有執行到
MyLog.e(">>>全部提交了<<<");
}catch(SQLExceptione){
isInsertOk=false;
MyLog.e(">>>出錯,准備rollback<<<");
try{
上面的那個SQLException e
換成 Exception e 應該就可以了,
Ⅹ JAVA JDBC事務提交的疑問。
>>啟動事務 conn.setAutoCommit();
這個不是啟動事務,而是設置事務是否自動提交,默認是自動提交,如果要手動控的話,寫成conn.setAutoCommit(false);
if(rs.next){
>>> ...執行更新
conn.commit();
}
這個也不對,RS不可能執更新操作。只能是查詢。
如果你進行了鎖表操作,那麼如果沒有commit()或rollbak()方法,是不會進行解鎖操作的。
下面給你些代碼段以做參考。
public class SQLCondition{
public ResultSet execuQuery(Connection conn) throws SQLException{
檢索操作.......
}
public int execuUpdate(Connection conn) throws SQLException{
更新操作.......
}
}
public class DBAccess(){
public void execute(){
SQLCondition condition = .....;
Connection conn = .....;
try{
conn.setAutoCommit(false); //設成非自動提交
condition.execuQuery(conn);
condition.execuUpdate(conn);
//如果操作成功會走到這一步,進行提交,可以解鎖
conn.commit();
}catch(SQLException){
//出現任何的SQL異常都可以捕捉到,進行事務回滾,也可以解鎖。
conn.rollbak();
}
}
}
>>自動默認是回滾事務?
默認的話,是執行一條就進行提交,如果錯了會回滾。