91嫩草国产线免费观看_欧美日韩中文字幕在线观看_精品精品国产高清a毛片_六月婷婷网 - 一级一级特黄女人精品毛片

JAVA事務的特性有哪些

首頁 > 公司事務2021-01-14 05:30:48

Java分布式系統處理分布式事務有哪些經典解決方

當我們在生產線上用一臺服務器來提供數據服務的時候,我會遇到如下的兩個問題:

1)一臺服務器的性能不足以提供足夠的能力服務于所有的網絡請求。

2)我們總是害怕我們的這臺服務器停機,造成服務不可用或是數據丟失。

于是我們不得不對我們的服務器進行擴展,加入更多的機器來分擔性能上的問題,以及來解決單點故障問題。 通常,我們會通過兩種手段來擴展我們的數據服務:

1)數據分區:就是把數據分塊放在不同的服務器上(如:uid % 16,一致性哈希等)。

2)數據鏡像:讓所有的服務器都有相同的數據,提供相當的服務。

對于第一種情況,我們無法解決數據丟失的問題,單臺服務器出問題時,會有部分數據丟失。所以,數據服務的高可用性只能通過第二種方法來完成——數據的冗余存儲(一般工業界認為比較安全的備份數應該是3份,如:Hadoop和Dynamo)。 但是,加入更多的機器,會讓我們的數據服務變得很復雜,尤其是跨服務器的事務處理,也就是跨服務器的數據一致性。這個是一個很難的問題。 讓我們用最經典的Use Case:“A帳號向B帳號匯錢”來說明一下,熟悉RDBMS事務的都知道從帳號A到帳號B需要6個操作:

從A帳號中把余額讀出來。

對A帳號做減法操作。

把結果寫回A帳號中。

從B帳號中把余額讀出來。

對B帳號做加法操作。

把結果寫回B帳號中。

為了數據的一致性,這6件事,要么都成功做完,要么都不成功,而且這個操作的過程中,對A、B帳號的其它訪問必需鎖死,所謂鎖死就是要排除其它的讀寫操作,不然會有臟數據的問題,這就是事務。那么,我們在加入了更多的機器后,這個事情會變得復雜起來:

1)在數據分區的方案中:如果A帳號和B帳號的數據不在同一臺服務器上怎么辦?我們需要一個跨機器的事務處理。也就是說,如果A的扣錢成功了,但B的加錢不成功,我們還要把A的操作給回滾回去。這在跨機器的情況下,就變得比較復雜了。

2)在數據鏡像的方案中:A帳號和B帳號間的匯款是可以在一臺機器上完成的,但是別忘了我們有多臺機器存在A帳號和B帳號的副本。如果對A帳號的匯錢有兩個并發操作(要匯給B和C),這兩個操作發生在不同的兩臺服務器上怎么辦?也就是說,在數據鏡像中,在不同的服務器上對同一個數據的寫操作怎么保證其一致性,保證數據不沖突?

同時,我們還要考慮性能的因素,如果不考慮性能的話,事務得到保證并不困難,系統慢一點就行了。除了考慮性能外,我們還要考慮可用性,也就是說,一臺機器沒了,數據不丟失,服務可由別的機器繼續提供。 于是,我們需要重點考慮下面的這么幾個情況:

1)容災:數據不丟、節點的Failover

2)數據的一致性:事務處理

3)性能:吞吐量 、 響應時間

前面說過,要解決數據不丟,只能通過數據冗余的方法,就算是數據分區,每個區也需要進行數據冗余處理。這就是數據副本:當出現某個節點的數據丟失時可以從副本讀到,數據副本是分布式系統解決數據丟失異常的唯一手段。所以,在這篇文章中,簡單起見,我們只討論在數據冗余情況下考慮數據的一致性和性能的問題。簡單說來:

1)要想讓數據有高可用性,就得寫多份數據。

2)寫多份的問題會導致數據一致性的問題。

3)數據一致性的問題又會引發性能問題

這就是軟件開發,按下了葫蘆起了瓢。

一致性模型

說起數據一致性來說,簡單說有三種類型(當然,如果細分的話,還有很多一致性模型,如:順序一致性,FIFO一致性,會話一致性,單讀一致性,單寫一致性,但為了本文的簡單易讀,我只說下面三種):

1)Weak 弱一致性:當你寫入一個新值后,讀操作在數據副本上可能讀出來,也可能讀不出來。比如:某些cache系統,網絡游戲其它玩家的數據和你沒什么關系,VOIP這樣的系統,或是百度搜索引擎(呵呵)。

2)Eventually 最終一致性:當你寫入一個新值后,有可能讀不出來,但在某個時間窗口之后保證最終能讀出來。比如:DNS,電子郵件、Amazon S3,Google搜索引擎這樣的系統。

3)Strong 強一致性:新的數據一旦寫入,在任意副本任意時刻都能讀到新值。比如:文件系統,RDBMS,Azure Table都是強一致性的。

從這三種一致型的模型上來說,我們可以看到,Weak和Eventually一般來說是異步冗余的,而Strong一般來說是同步冗余的,異步的通常意味著更好的性能,但也意味著更復雜的狀態控制。同步意味著簡單,但也意味著性能下降。 好,讓我們由淺入深,一步一步地來看有哪些技術:

Master-Slave

首先是Master-Slave結構,對于這種加構,Slave一般是Master的備份。在這樣的系統中,一般是如下設計的:

1)讀寫請求都由Master負責。

2)寫請求寫到Master上后,由Master同步到Slave上。

從Master同步到Slave上,你可以使用異步,也可以使用同步,可以使用Master來push,也可以使用Slave來pull。 通常來說是Slave來周期性的pull,所以,是最終一致性。這個設計的問題是,如果Master在pull周期內垮掉了,那么會導致這個時間片內的數據丟失。如果你不想讓數據丟掉,Slave只能成為Read-Only的方式等Master恢復。

當然,如果你可以容忍數據丟掉的話,你可以馬上讓Slave代替Master工作(對于只負責計算的節點來說,沒有數據一致性和數據丟失的問題,Master-Slave的方式就可以解決單點問題了) 當然,Master Slave也可以是強一致性的, 比如:當我們寫Master的時候,Master負責先寫自己,等成功后,再寫Slave,兩者都成功后返回成功,整個過程是同步的,如果寫Slave失敗了,那么兩種方法,一種是標記Slave不可用報錯并繼續服務(等Slave恢復后同步Master的數據,可以有多個Slave,這樣少一個,還有備份,就像前面說的寫三份那樣),另一種是回滾自己并返回寫失敗。(注:一般不先寫Slave,因為如果寫Master自己失敗后,還要回滾Slave,此時如果回滾Slave失敗,就得手工訂正數據了)你可以看到,如果Master-Slave需要做成強一致性有多復雜。

Master-Master

Master-Master,又叫Multi-master,是指一個系統存在兩個或多個Master,每個Master都提供read-write服務。這個模型是Master-Slave的加強版,數據間同步一般是通過Master間的異步完成,所以是最終一致性。 Master-Master的好處是,一臺Master掛了,別的Master可以正常做讀寫服務,他和Master-Slave一樣,當數據沒有被復制到別的Master上時,數據會丟失。很多數據庫都支持Master-Master的Replication的機制。

另外,如果多個Master對同一個數據進行修改的時候,這個模型的惡夢就出現了——對數據間的沖突合并,這并不是一件容易的事情??纯碊ynamo的Vector Clock的設計(記錄數據的版本號和修改者)就知道這個事并不那么簡單,而且Dynamo對數據沖突這個事是交給用戶自己搞的。就像我們的SVN源碼沖突一樣,對于同一行代碼的沖突,只能交給開發者自己來處理。(在本文后后面會討論一下Dynamo的Vector Clock)

Two/Three Phase Commit

這個協議的縮寫又叫2PC,中文叫兩階段提交。在分布式系統中,每個節點雖然可以知曉自己的操作時成功或者失敗,卻無法知道其他節點的操作的成功或失敗。當一個事務跨越多個節點時,為了保持事務的ACID特性,需要引入一個作為協調者的組件來統一掌控所有節點(稱作參與者)的操作結果并最終指示這些節點是否要把操作結果進行真正的提交(比如將更新后的數據寫入磁盤等等)。

在java中,“事務”選項有什么用?

一、什么是Java事務
通常的觀念認為,事務僅與數據庫相關。
事務必須服從ISO/IEC所制定的ACID原則。ACID是原子性(atomicity)、一致性(consistency)、隔離性
(isolation)和持久性(durability)的縮寫。事務的原子性表示事務執行過程中的任何失敗都將導致事務所做的任何修改失效。一致性表示

當事務執行失敗時,所有被該事務影響的數據都應該恢復到事務執行前的狀態。隔離性表示在事務執行過程中對數據的修改,在事務提交之前對其他事務不可見。持
久性表示已提交的數據在事務執行失敗時,數據的狀態都應該正確。
通俗的理解,事務是一組原子操作單元,從數據庫角度說,就是一組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 如何建立事務 都有哪些方法

如果是用jdbc 上面beginTransaction 所有操作執行完后 commit 用 try catch 包起來 catch到異常 rollback spring 用注解就可以

Java數據庫里,事務的ACID是指什么?

轉行想做IT,今天的培訓內容有點沒聽清楚,請大神指教一番,最好詳細一點。
其實我覺得作為一個IT程序員,最重要的一點就是會自己查資料,像事內務的ACID這些最基本的東容東,網上隨便一搜一大片,舉例的更是數不勝數,百度百科也有介紹。
ACID,指數據庫事務正確執行的四個基本要素的縮寫。包含:原子性(Atomicity)、一致性(Consistency)、隔離性(Isolation)、持久性(Durability)。一個支持事務(Transaction)的數據庫,必須要具有這四種特性,否則在事務過程(Transaction processing)當中無法保證數據的正確性。
ACID,指數據庫事務正確執行的四個基本要素的縮寫。包含:原子性(Atomicity)、一致性(Consistency)、隔離性(Isolation)、持久性(Durability)。

相關推薦:

挪用個體公司資金(挪用個體戶資金犯罪嗎)

騙取出口退稅罪構成(進出口騙稅1000萬怎么處罰)

強迫交易罪(強迫交易罪立案標準以及刑事責任)

期貨居間人(什么是期貨居間人)

強奸罪坐牢多少年(強奸罪判多少年刑)