1. java的框架spring如何配置分布式事務
分布式事務本身不是程序做的,我們不需要在代碼中明確地做這些事,因為是不是分布式對於代碼來說,代碼寫起來完全相同。
只是選擇支持 JTA XA (也叫 2-Phase Commit, 2PC) 的數據源就可以了,你默認使用的 DataSource 可能不是 XA ( Weblogic 把它叫 TX)。
一般在網站編程時多數人可能是用 Spring 搭配 tomcat commons-dbcp 那個數據源,那個可能就不是支持 XA 的數據源,如果你打算在復雜企業應用生態系統中使用J2EE 就不要用 Spring 提供 commonbs-dbcp 那種小作坊式的做法,因為它是假設自己的程序就是獨立生態系統,當你需要與外界打交道時就碰到諸多問題,這也是為什麼很多大企業依然還是會使用 EJB 的原因(EJB 已經考慮到這點,並把它寫入到J2EE 標准中),我們推薦用伺服器自己的數據源,也就是 lookup JNDI,這樣的話,是不是 XA 事務就由伺服器的配置來定製,代碼就不需要任何配置來決定是不是 XA 了 ;事務本身是不是 XA (分布式的)是伺服器的事,伺服器來管理「資源」 (包括數據源,JMS 連接等,一個資源(JDBC連接)如何參與事務是「資源管理器」(驅動程序)的職責,跟程序無關),伺服器提供事務管理並作為「事務協調者」來處理多個「資源管理器」(不同的資料庫連接)之間的事務一致性,,而 Spring 的職責很簡單,對於我們希望 Spring 自動提交或回滾事務時,在配置中指定需要回滾的異常的類型。
不過我沒有實際使用過 Spring,我有多年的 EJB 經驗,這其中的原理是相同的,因為這是 J2EE 標准規范要求達到的。
2. 求救,分布式事務怎麼處理
目前比較多的解決方案有幾個:
一、結合MQ消息中間件實現的可靠消息最終一致性
二、TCC補償性事務解決方案
三、最大努力通知型方案
第一種方案:可靠消息最終一致性,需要業務系統結合MQ消息中間件實現,在實現過程中需要保證消息的成功發送及成功消費。即需要通過業務系統控制MQ的消息狀態
第二種方案:TCC補償性,分為三個階段TRYING-CONFIRMING-CANCELING。每個階段做不同的處理。
TRYING階段主要是對業務系統進行檢測及資源預留
CONFIRMING階段是做業務提交,通過TRYING階段執行成功後,再執行該階段。默認如果TRYING階段執行成功,CONFIRMING就一定能成功。
CANCELING階段是回對業務做回滾,在TRYING階段中,如果存在分支事務TRYING失敗,則需要調用CANCELING將已預留的資源進行釋放。
第三種方案:最大努力通知xing型,這種方案主要用在與第三方系統通訊時,比如:調用微信或支付寶支付後的支付結果通知。這種方案也是結合MQ進行實現,例如:通過MQ發送http請求,設置最大通知次數。達到通知次數後即不再通知。
具體的案例你也可以參考下這篇博客,它上面有完整的電商系統分布式事務實現案例:http://www.roncoo.com/article/detail/124243
3. Java開發的學習內容都有哪些
java學習內容你可以參考以下:
一、JavaEE基礎
Java基礎語法、面向對象、核心類庫、集合、異常、IO、線程、JDK新特性;
二、JavaWeb開發
前端技術、資料庫、JAVA資料庫操作、軟體伺服器及伺服器相關技術、動態網頁JSP、AJAX;
三、Java高級框架
SpringMVC、MyBatis、Spring、MySQL高級、Linux&Redis&Nginx、Maven;
四、大型微服務分布式項目實戰
SpringBoot、SpringCloud、Git、Dubbo、Zookeeper、AngularJS、Spring Security、BCrypt加密、FastDFS、分布式事務處理、Redis Cluster、Solr、SolrCloud、Freemarker、JMS、簡訊發送平台、SSO解決方案、CORS、Twitter的Snowflake、SpringTask、Maven Profile、MongoDB簡介、MyCat、Docker、Jenkins;
五、微服務大型項目實戰
4. 如何用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;
}
}
5. Java-JAVA中都有哪幾種分布式實現方式,各有什麼優缺點
常用的有EJB、rmi、Web Service,還有Hessian、NIO等,它們的優缺點比較比下:
1:EJB
優勢:可擴回展性好,安全性強,答支持分布式事務處理。
劣勢:不能跨語言;配置相對復雜,不同J2EE容器之間很難做無縫遷移。
2:rmi
優勢:面向對象的遠程服務模型;基於TCP協議上的服務,執行速度快。
劣勢:不能跨語言;每個遠程對象都要綁定埠,不易維護;不支持分布式事務JTA,RMI框架對於安全性、事務、可擴展性的支持非常有限。
3: Web Service
優勢:跨語言、跨平台,SOA思想的實現;安全性高;可以用來兼容legacy系統的功能
劣勢:性能相對差,不支持兩階段事務
4:Hessian
優勢:使用簡單,速度快;跨語言,跨平台;可以用來兼容legacy系統的功能。
劣勢:安全性的支持不夠強,不支持兩階段事務。
5:NIO(Mina/Netty)
優點:基於TCP通信,效率上高於HTTP的方式,非阻塞IO應對高並發綽綽有餘。根據具體的需要制定數據傳輸的格式,可擴展性強。
缺點:不能跨語言,無法穿透防火牆。
6. 在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容器事務。
如果滿意請及時採納,謝謝~
7. Java分布式系統處理分布式事務有哪些經典解決方案
為了解決大家在來實施源分布式服務化架構過程中關於分布式事務問題的困擾,將基於支付系統真實業務中的經典場景來對「可靠消息的最終一致性方案」、「TCC兩階段型方案」和「最大努力通知型方案」這3種柔性事務解決方案進行具體設計實現和詳細講解。
https://yq.aliyun.com/articles/69572