java中什麼是事務
1. java事務的特性有哪些
ACID特徵
Atomic原子性、Consistency一致性、Isolation隔離性和Durability持久性。
原子性:指整個事務是不可以分割的工作單元。只有事務中所有的操作執行成功,才算整個事務成功,事務中任何一個SQL語句執行失敗,那麼已經執行成功的SQL語句也必須撤銷,資料庫狀態應該回到執行事務前的狀態。
一致性:指資料庫事務不能破壞關系數據的完整性以及業務邏輯上的一致性。例如對於銀行轉賬事務,不管事務成功還是失敗,應該保證事務結束後兩個轉賬賬戶的存款總額是與轉賬前一致的。
隔離性:指的是在並發環境中,當不同的事務同時操縱相同的數據時,每個事務都有各自的完整數據空間。
持久性:指的是只要事務成功結束它對資料庫所做的更新就必須永久保存下來。即使發生系統崩潰,重新啟動資料庫系統後,資料庫還能恢復到事務成功結束時的狀態。
2. java事務相關
Java中的事務處理
一般情況下,J2EE應用伺服器支持JDBC事務、JTA(JavaTransactionAPI)事務、容器管理事務。一般情況下,最好不要在程序中同時使用上述三種事務類型,比如在JTA事務中嵌套JDBC事務。第二方面,事務要在盡可能短的時間內完成,不要在不同方法中實現事務的使用。下面我們列舉兩種事務處理方式。
1、JavaBean中使用JDBC方式進行事務處理
在JDBC中怎樣將多個SQL語句組合成一個事務呢?在JDBC中,打開一個連接對象Connection時,預設是auto-commit模式,每個SQL語句都被當作一個事務,即每次執行一個語句,都會自動的得到事務確認。為了能將多個SQL語句組合成一個事務,要將auto-commit模式屏蔽掉。在auto-commit模式屏蔽掉之後,如果不調用commit()方法,SQL語句不會得到事務確認。在最近一次commit()方法調用之後的所有SQL會在方法commit()調用時得到確認。
publicintdelete(intsID){
dbc=newDataBaseConnection();
Connectioncon=dbc.getConnection();
try{
con.setAutoCommit(false);//更改JDBC事務的默認提交方式
dbc.executeUpdate("deletefrombylawwhereID="+sID);
dbc.executeUpdate("deletefrombylaw_contentwhereID="+sID);
dbc.executeUpdate("deletefrombylaw_affixwherebylawid="+sID);
con.commit();//提交JDBC事務
con.setAutoCommit(true);//恢復JDBC事務的默認提交方式
dbc.close();
return1;
}
catch(Exceptionexc){
con.rollBack();//回滾JDBC事務
exc.printStackTrace();
dbc.close();
return-1;
}
}
2、SessionBean中的JTA事務
JTA是事務服務的J2EE解決方案。本質上,它是描述事務介面(比如UserTransaction介面,開發人員直接使用該介面或者通過J2EE容器使用該介面來確保業務邏輯能夠可靠地運行)的J2EE模型的一部分。JTA具有的三個主要的介面分別是UserTransaction介面、TransactionManager介面和Transaction介面。這些介面共享公共的事務操作,例如commit()和rollback(),但是也包含特殊的事務操作,例如suspend(),resume()和enlist(),它們只出現在特定的介面上,以便在實現中允許一定程度的訪問控制。例如,UserTransaction能夠執行事務劃分和基本的事務操作,而TransactionManager能夠執行上下文管理。
應用程序可以調用UserTransaction.begin()方法開始一個事務,該事務與應用程序正在其中運行的當前線程相關聯。底層的事務管理器實際處理線程與事務之間的關聯。UserTransaction.commit()方法終止與當前線程關聯的事務。UserTransaction.rollback()方法將放棄與當前線程關聯的當前事務。
publicintdelete(intsID){
DataBaseConnectiondbc=null;
dbc=newDataBaseConnection();
dbc.getConnection();
UserTransactiontransaction=sessionContext.getUserTransaction();//獲得JTA事務
try{
transaction.begin();//開始JTA事務
dbc.executeUpdate("deletefrombylawwhereID="+sID);
dbc.executeUpdate("deletefrombylaw_contentwhereID="+sID);
dbc.executeUpdate("deletefrombylaw_affixwherebylawid="+sID);
transaction.commit();//提交JTA事務
dbc.close();
return1;
}
catch(Exceptionexc){
try{
transaction.rollback();//JTA事務回滾
}
catch(Exceptionex){
//JTA事務回滾出錯處理
ex.printStackTrace();
}
exc.printStackTrace();
dbc.close();
return-1;
}
}