JDBC事务和JTA事务的区别 --包含spring事务 声明式事务
2019獨(dú)角獸企業(yè)重金招聘Python工程師標(biāo)準(zhǔn)>>>
一、事務(wù)概述
事務(wù)表示一個(gè)由一系列的數(shù)據(jù)庫操作組成的不可分割的邏輯單位,其中的操作要么全做要么全都不做。
與事務(wù)相關(guān)的操作主要有:
BEGIN TRANSACTION; 開始一個(gè)事務(wù),方法是:begin()
COMMIT; 提交一個(gè)事務(wù),方法是:commit()
ROLLBACK; 回滾一個(gè)事務(wù),方法是:rollback()
PREPARE; ??準(zhǔn)備提交一個(gè)事務(wù),方法是:prepare()
二、事務(wù)的特性(ACID)
1、原子性:同一個(gè)事務(wù)的操作要么全部成功執(zhí)行,要么全部撤消
2、隔離性:事務(wù)的所有操作不會(huì)被其它事務(wù)干擾
3、一致性:在操作過程中不會(huì)破壞數(shù)據(jù)的完整性
4、時(shí)效性 :事務(wù)的結(jié)果必須持久保存于介質(zhì)上
三、事務(wù)處理方式
在JDBC連接中,使用命令聲明事務(wù)的開始、提交和取消。如前一章介紹的數(shù)據(jù)庫處理方式,它通過java.sql.Connection接口實(shí)現(xiàn),可以啟用AutoCommit。這種方式使用簡單,但性能較低。
利用JavaEE規(guī)范的JTA驅(qū)動(dòng)程序。這種方式性能更好,是EJB和JMS的常用方式。
Java EE 的分布式事務(wù)服務(wù)包括5個(gè)層次:事務(wù)管理器、應(yīng)用服務(wù)器、資源管理器、應(yīng)用程序、通信資源管理器。
事務(wù)管理器:完成事務(wù)管理
應(yīng)用服務(wù)器:為應(yīng)用提供服務(wù)
資源管理器:連接相應(yīng)的資源
應(yīng) 用程 序:需要使用事務(wù)的應(yīng)用
通信資源管理器:接收事務(wù)、傳播事務(wù)
四、JDBC和JTA事務(wù)區(qū)別
簡單的說 jta是多庫的事務(wù) jdbc是單庫的事務(wù)
1、jdbc事務(wù)
JDBC事務(wù)由Connnection對(duì)象控制管理,也就是說,事務(wù)管理實(shí)際上是在JDBC Connection中實(shí)現(xiàn)。事務(wù)周期限于Connection的生命周期。JDBC Connection 接口( java.sql.Connection )提供了兩種事務(wù)模式:自動(dòng)提交和手工提交。
自動(dòng)提交:缺省是自動(dòng)提交。一條對(duì)數(shù)據(jù)庫的更新(增/刪/改)代表一項(xiàng)事務(wù)操作,操作成功后,系統(tǒng)將自動(dòng)調(diào)用commit()來提交,否則將調(diào)用rollback()來回滾。
手工提交:通過調(diào)用setAutoCommit(false)來禁止自動(dòng)提交。這樣就可把多個(gè)數(shù)據(jù)庫操作的表達(dá)式作為一個(gè)事務(wù),在操作完成后調(diào) 用commit()來進(jìn)行整體提交,其中任何一個(gè)操作失敗,都不會(huì)執(zhí)行到commit(),并產(chǎn)生異常;此時(shí)可在異常捕獲時(shí)調(diào)用rollback()進(jìn)行回滾,以保持多次更新操作后,相關(guān)數(shù)據(jù)的一致性,示例如下:
try {
????conn =DriverManager.getConnection(...);
????conn.setAutoCommit(false);//禁止自動(dòng)提交,設(shè)置回滾點(diǎn)
????stmt = conn.createStatement();
????stmt.executeUpdate(...); //數(shù)據(jù)庫更新操作1
????stmt.executeUpdate(...); //數(shù)據(jù)庫更新操作2
????conn.commit(); //事務(wù)提交
}catch(Exception ex) {
????log.error(...);
????try {
????????conn.rollback(); //操作不成功則回滾
????}catch(Exception e) {
????????log.error(...);
????}
}
JDBC 事務(wù)的一個(gè)缺點(diǎn)是事務(wù)的范圍局限于一個(gè)數(shù)據(jù)庫連接。一個(gè) JDBC 事務(wù)不能跨越多個(gè)數(shù)據(jù)庫。
2、jta事務(wù)
JTA(Java Transaction API)提供了跨數(shù)據(jù)庫連接(或其他JTA資源)的事務(wù)管理能力。JTA事務(wù)管理則由JTA容器實(shí)現(xiàn),J2ee框架中事務(wù)管理器與應(yīng)用程序,資源管理器,以及應(yīng)用服務(wù)器之間的事務(wù)通訊。?
1)JTA的構(gòu)成
a、高層應(yīng)用事務(wù)界定接口,供事務(wù)客戶界定事務(wù)邊界的
b、X/Open XA協(xié)議(資源之間的一種標(biāo)準(zhǔn)化的接口)的標(biāo)準(zhǔn)Java映射,它可以使事務(wù)性的資源管理器參與由外部事務(wù)管理器控制的事務(wù)中
c、高層事務(wù)管理器接口,允許應(yīng)用程序服務(wù)器為其管理的應(yīng)用程序界定事務(wù)的邊界?
2)JTA的主要接口
位于javax.transaction包中
a、UserTransaction接口:讓應(yīng)用程序得以控制事務(wù)的開始、掛起、提交、回滾等。由Java客戶端程序或EJB調(diào)用。
b、TransactionManager 接口:用于應(yīng)用服務(wù)器管理事務(wù)狀態(tài)
c、Transaction接口:用于執(zhí)行相關(guān)事務(wù)操作
d、XAResource接口:用于在分布式事務(wù)環(huán)境下,協(xié)調(diào)事務(wù)管理器和資源管理器的工作
e、Xid接口:為事務(wù)標(biāo)識(shí)符的Java映射
注:前3個(gè)接口位于Java EE版的類庫 javaee.jar 中,Java SE中沒有提供!UserTransaction是編程常用的接口
注意的是JTA只提供了接口,沒有具體的實(shí)現(xiàn)。
JTS(Java Transaction Service)是服務(wù)OTS的JTA的實(shí)現(xiàn)。簡單的說JTS實(shí)現(xiàn)了JTA接口,并且符合OTS的規(guī)范。
JTA的事務(wù)周期可橫跨多個(gè)JDBC Connection生命周期,對(duì)眾多Connection進(jìn)行調(diào)度,實(shí)現(xiàn)其事務(wù)性要求。
JTA可以處理任何提供符合XA接口的資源。包括:JDBC連接,數(shù)據(jù)庫,JMS,商業(yè)對(duì)象等等。
3)JTA編程的基本步驟
a、首先配置JTA ,建立相應(yīng)的數(shù)據(jù)源
b、建立事務(wù):通過創(chuàng)建UserTransaction類的實(shí)例來開始一個(gè)事務(wù)。代碼如下:
Context ctx = new InitialContext(p) ;
??UserTransaction trans = (UserTransaction) ctx.lookup("javax. Transaction.UserTransaction")
c、開始事務(wù):代碼為 trans.begin() ;
d、找出數(shù)據(jù)源:從Weblogic Server上找到數(shù)據(jù)源,代碼如下:
DataSource ds = (DataSource) ctx.lookup(“mysqldb") ;
e、建立數(shù)據(jù)庫連接:Connection mycon = ds.getConnection() ;
f、執(zhí)行SQL操作:stmt.executeUpdate(sqlS);
g、完成事務(wù):trans.commit(); / trans.rollback();
h、關(guān)閉連接:mycon.close() ;
轉(zhuǎn)載于:https://my.oschina.net/u/2401092/blog/1919764
總結(jié)
以上是生活随笔為你收集整理的JDBC事务和JTA事务的区别 --包含spring事务 声明式事务的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Flex布局
- 下一篇: 浅析VS2010反汇编 VS 反汇编方