java事務管理
① java如何進行事務管理,什麼時候用事務控制
Java種運用了大量的事務管理,就是對一系列的資料庫操作進行統一的提交或回滾操作,比如說做一個轉賬功能,要更改帳戶兩邊的數據,這時候就必須要用事務才能算是嚴謹的做法。要麼成功,要麼失敗,保持數據一致性。如果中間有一個操作出現異常,那麼回滾之前的所有操作。
在strut2框架中為了避免多個用戶同時訪問伺服器,都會使用事務管理來管理訪問的人數。
② 如何用java開啟mysql事務,要求詳細
看你是什麼事務,jdbc事務,還是分布式事務,還是容器事務
1,編程式事務管理(jdbc的事務是綁定在connection上的)
Connection conn = null;
try
{
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection("jdbc:oracle:thin:@host:1521:SID","username","password");
conn.setAutoCommit(false); //取消自動提交
PreparedStatement ps = conn.prepareCall("update something");
ResultSet rs = ps.executeQuery();
conn.commit(); //手動提交
}
catch (Exception e)
{
conn.rollback();
e.printStackTrace();
}
finally
{
conn.close();
}
2,聲明式事務
先在工程的application.xml配置文件中添加如下代碼,開啟事務
<!-- 聲明式事務控制配置 -->
<tx:annotation-driven transaction-manager="txManager"/>
<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="datasource" ref="bassDataSource"></property>
</bean>
然後在你需要開啟事務的介面前面添加註解
@Transactional(rollbackFor = IOException.class)
public void add(String name) throws IOException
{
System.out.println("可以再類里和方法裡面添加事務註解0~0");
throw new IOException();
}
直接調用介面方法就好
分布式事務處理(mysql貌似在5.X之後才支持) 的話,
1.可以直接使用spring+atomikos框架進行管理
參考:
就不貼測試代碼了,自己看著配置吧
2,使用JTA(Java Transaction API)進行分布式事務管理(測試代碼如下)
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import javax.naming.InitialContext;
import javax.sql.DataSource;
import javax.transaction.SystemException;
import javax.transaction.UserTransaction;
import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;
//分布式事務處理
public class transferAccount
{
@SuppressWarnings("null")
public void testTransferAccount()
{
UserTransaction userts = null;
Connection connA = null;
PreparedStatement psA = null;
InitialContext context = null;
Connection connB = null;
PreparedStatement psB = null;
try
{
//獲得事務管理對象
userts = (UserTransaction) context.lookup("java:comp/UserTransaction");
//獲取兩個資料庫
connA = getDataSourceA().getConnection();
connB = getDataSourceB().getConnection();
//開啟事務
userts.begin();
//sql語句
psA = connA.prepareStatement("我加1");
psB = connB.prepareStatement("我減1");
//執行sql
psA.executeUpdate();
psB.executeUpdate();
//事務提交
userts.commit();
} catch (Exception e)
{
try
{
userts.rollback();
} catch (IllegalStateException | SecurityException
| SystemException e1)
{
e1.printStackTrace();
}
e.printStackTrace();
}
finally
{
try
{
psA.close();
psB.close();
connA.close();
connB.close();
} catch (SQLException e)
{
e.printStackTrace();
}
}
}
public DataSource getDataSourceA()
{
MysqlDataSource dataSource = new MysqlDataSource();
dataSource.setDatabaseName("mysql");
dataSource.setServerName("server");
dataSource.setPortNumber(1433);
dataSource.setUser("test");
dataSource.setPassword("test");
return dataSource;
}
public DataSource getDataSourceB()
{
MysqlDataSource dataSource = new MysqlDataSource();
dataSource.setDatabaseName("mysql");
dataSource.setServerName("server");
dataSource.setPortNumber(1435);
dataSource.setUser("test1");
dataSource.setPassword("test1");
return dataSource;
}
}
③ java中什麼是編程式聲明式事務管理
編程式意思就是在方法里通過一些代碼來實現一些事務的提交回滾等操作。
與之區別的是聲明式事務,比如使用spring的註解structs的攔截器等實現的事務。
④ Java 編程 ,事務管理的作用
事務就是對一系列的資料庫操作進行統一的提交或回滾操作,比如說做一個轉賬功能,要更改帳戶兩邊的數據,這時候就必須要用事務才能算是嚴謹的做法。要麼成功,要麼失敗,保持數據一致性。如果中間有一個操作出現異常,那麼回滾之前的所有操作。
這樣有什麼好處呢。
這樣可以防止在一些意外(例如說突然斷電)的情況下出現亂數據,防止資料庫數據出現問題。這邊加了錢,那邊卻還是一樣的數,這就完了。要是開放一個網上交易的平台,這樣就會出大問題的!
還有其他的一些操作,像是要添加多條數據,如果程序要求必須全部正確才能插入的話,事務又起大作用了。
等等。。。開發中為了避免這種情況一般都會進行事務管理。
在JDBC中是通過Connection對象進行事務管理的,默認是自動提交事務,可以手工將自動提交關閉,通過commit方法進行提交,rollback方法進行回滾,如果不提交,則數據不會真正的插入到資料庫中。
Hibernate中是通過Transaction進行事務管理,處理方法與JDBC中類似。
Spring中也有自己的事務管理機制,使用TransactionMananger進行管理,可以通過Spring的注入來完成此功能。
⑤ java的框架spring中的事務攔截器和事務管理器都是幹嘛的
事務管理器是運用AOP的原理,自動在目標方法插入事務代碼。Spring中的事務管理器有很多種:
JDBC DataSource事務管理器:
org.springframework.jdbc.datasource.DataSourceTransactionManager
Hibernate的事務管理器:
org.springframework.orm.hibernate.HibernateTransactionManager
JDO的事務管理器:
org.springframework.orm.jdo.JdoTransactionManager
JTA事務管理器:
org.springframework.transaction.jta.JtaTransactionManager
OJB事務管理器:
org.springframework.orm.ojb.
⑥ 在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容器事務。
如果滿意請及時~~,謝謝~
⑦ java有哪些框架需要學習呢
Java有三大框架:Struts,Hibernate和Spring。struts是開源軟體,通過學習struts的流程,架構,model部分,view部分和contorller組件來了解框架;Hibernate是開源代碼的對象關系映射框架,通過學習session介面等來了解框架。
1.三大框架簡介1、Spring Spring 是一個解決了許多在J2EE 開發中常見的問題的強大框架. Spring 提供了管理業務對 象的一致方法並且鼓勵了注入對介面編程而不是對類編程的良好習慣.Spring 的架構基礎是 基於使用JavaBean 屬性的Inversion Control容器.然而,這僅僅是完整圖景中的一部 分:Spri
跟著這個網站學吧:網站內容豐富,既有Java SE的基礎:中級:前端:J2EE:Java框架:還有實踐項目:我自己就是跟著上面的順序一路學過來...
2.Java 語言編寫的 AOP 框架,它給 POJOs 提供了聲明式的事務管理和其他企業事務--如... 開始的學習和應用非常的艱苦,很多東西都不 能一下子就很容易的理解.EJB 要嚴格地...
這是兩種以跨平台為特色的開發方式.Qt更多被認為是一種框架,但是Qt中有新增一些C... 博文 在博主認為,學習java的最佳學習方法莫過於視頻+博客+書籍+總結,前三者博主將...查看全部
2016年8月22日-根據每個人的學習方式、方法不同,可以制定具體的計劃。今天為大家整理了搭建Java知識框架的幾個方法... java框架SSM一. 序言本次培訓分四個階段進行,...
3.2008年1月3日-和如何學習JAVA框架的一點看法吧,希望對「望而生畏」的您,和「蠢蠢欲動... 自己需要的時候去過來就行,個人也認為這是很好的一種方式,往往自己從... 這就是第二個問題。 第二個問題,我想分兩方面來回答一下。1、學什麼?想要學好,當...
2016年8月3日- 用配置文件或者是Annonation的方式來代替New創建實例,可以說這是一個... Java框架學習 順序是哪些? Java框架學習 順序是哪些?詳細步驟具體如下:...
[ 圖文 ] 2013年12月9日- 三大框架簡介JAVA三大框架用來做WEB應用。struts主要負責表示層的顯示spring利用Java框架學習方法更多下載資源、學習資料請訪問CSDN文庫頻道....
Java 語言編寫的 AOP框架, 它給 POJOs 提供了聲明式的事務管理和其他企業事務--如... 在 EJB 開始的學習和應用非常的艱苦, 很多東西都不能一下子就很容易的理解.
希望能幫到你,謝謝!
⑧ java 兩個項目之間如何實現事務管理
可以去看看JTA事務 需要XA驅動
網路下atomikos這個,很多例子
不同數據源也可以回滾
搞錯了,不同的項目不會弄,進程間通信的話才可以
如果是你有許可權使用兩個項目的資料庫,整到一個項目,這樣即使數據源(orcal,mysql等等)不同,可以用atomikos來管理事務,就可以回滾了。
⑨ 如何用java開啟mysql事務,要求詳細
<!-- 定義事務管理器 -->
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
<!--使用注釋事務 -->
<tx:annotation-driven transaction-manager="transactionManager" />
配置完後在需要用事務的方法頭加上@Transactional就可以了。
還要注意mysql建的表engine必須是innoDB的,不然不支持事務。
⑩ 如何用java開啟mysql事務,要求詳細
如何用java開啟mysql事務,要求詳細
看你是什麼事務,jdbc事務,還是分布式事務,還是容器事務
1,編程式事務管理(jdbc的事務是綁定在connection上的)
Connection conn = null;
try
{
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection("jdbc:oracle:thin:@host:1521:SID","username","password");
conn.setAutoCommit(false); //取消自動提交
PreparedStatement ps = conn.prepareCall("update something");
ResultSet rs = ps.executeQuery();
conn.commit(); //手動提交
}
catch (Exception e)
{
conn.rollback();
e.printStackTrace();
}
finally
{
conn.close();
}
2,聲明式事務
先在工程的application.xml配置文件中添加如下代碼,開啟事務
<!-- 聲明式事務控制配置 -->
<tx:annotation-driven transaction-manager="txManager"/>
<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="datasource" ref="bassDataSource"></property>
</bean>
然後在你需要開啟事務的介面前面添加註解
@Transactional(rollbackFor = IOException.class)
public void add(String name) throws IOException
{
System.out.println("可以再類里和方法裡面添加事務註解0~0");
throw new IOException();
}
直接調用介面方法就好
分布式事務處理(mysql貌似在5.X之後才支持) 的話,
1.可以直接使用spring+atomikos框架進行管理
參考:http://blog.chinaunix.net/uid-21162795-id-3424973.html
就不貼測試代碼了,自己看著配置吧
2,使用JTA(Java Transaction API)進行分布式事務管理(測試代碼如下)
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import javax.naming.InitialContext;
import javax.sql.DataSource;
import javax.transaction.SystemException;
import javax.transaction.UserTransaction;
import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;
//分布式事務處理
public class transferAccount
{
@SuppressWarnings("null")
public void testTransferAccount()
{
UserTransaction userts = null;
Connection connA = null;
PreparedStatement psA = null;
InitialContext context = null;
Connection connB = null;
PreparedStatement psB = null;
try
{
//獲得事務管理對象
userts = (UserTransaction) context.lookup("java:comp/UserTransaction");
//獲取兩個資料庫
connA = getDataSourceA().getConnection();
connB = getDataSourceB().getConnection();
//開啟事務
userts.begin();
//sql語句
psA = connA.prepareStatement("我加1");
psB = connB.prepareStatement("我減1");
//執行sql
psA.executeUpdate();
psB.executeUpdate();
//事務提交
userts.commit();
} catch (Exception e)
{
try
{
userts.rollback();
} catch (IllegalStateException | SecurityException
| SystemException e1)
{
e1.printStackTrace();
}
e.printStackTrace();
}
finally
{
try
{
psA.close();
psB.close();
connA.close();
connB.close();
} catch (SQLException e)
{
e.printStackTrace();
}
}
}
public DataSource getDataSourceA()
{
MysqlDataSource dataSource = new MysqlDataSource();
dataSource.setDatabaseName("mysql");
dataSource.setServerName("server");
dataSource.setPortNumber(1433);
dataSource.setUser("test");
dataSource.setPassword("test");
return dataSource;
}
public DataSource getDataSourceB()
{
MysqlDataSource dataSource = new MysqlDataSource();
dataSource.setDatabaseName("mysql");
dataSource.setServerName("server");
dataSource.setPortNumber(1435);
dataSource.setUser("test1");
dataSource.setPassword("test1");
return dataSource;
}
}