1、事務java
(1)事務(Transaction),通常是指要作的或所作的事情。在計算機術語中是指訪問並可能更新數據庫中各類數據項的一個程序執行單元(unit)。git
(2)事務應該具備4個屬性:原子性、一致性、隔離性、持久性。這四個屬性一般稱爲ACID特性。
原子性(atomicity)。一個事務是一個不可分割的工做單位。好比A向B轉帳1000元,那麼這就必定要保證原子性(要麼同時成功,要麼同時失敗)。github
一致性(consistency)。事務必須是使數據庫從一個一致性狀態變到另外一個一致性狀態,一致性與原子性是密切相關的。好比A向B轉帳,不可能A扣了錢,B卻沒收到(這就是非一致性)。數據庫
隔離性(isolation)。一個事務的執行不能被其餘事務干擾。即一個事務內部的操做及使用的數據對併發的其餘事務是隔離的,併發執行的各個事務之間不能互相干擾。好比A和C同時向B轉帳,那B同一時間只能和一我的交易(同時只能有一個交易在執行)。session
持久性(durability)。持久性也稱永久性(permanence),指一個事務一旦提交,它對數據庫中數據的改變就應該是永久性的。接下來的其餘操做或故障不該該對其有任何影響。A向B轉帳,成功之後B的帳戶就存入了轉帳數額,在不作其餘的操做前提下數據是永久性的。併發
2、Hibernate事務處理框架
(1)Hibernate事務處理分佈式
在Hibernate框架中,使用Transaction接口來維護了事務實現(JTA,JDBC)的抽象。
事務與Session相關聯,並經過調用session.beginTransaction()實例化。atom
Transaction接口的方法以下:
void begin() 開始一個新的事務。
void commit() 結束工做單位,在FlushMode.NEVER中除外。
void rollback() 強制此事務回滾。
void setTimeout(int seconds) 它爲由此實例開始的後續調用啓動的任何事務設置事務超時。
boolean isAlive() 檢查交易是否仍然存在。
void registerSynchronization(Synchronization s) 爲此事務註冊用戶同步回調。
boolean wasCommited() 檢查事務是否成功提交。
boolean wasRolledBack() 檢查事務是否成功回滾。線程
(2)Hibernate事務綁定
Hibernate使用本地線程綁定事務(因此不能在一個線程中啓動多個線程去操做不一樣的數據工做),當請求Service方法時打開經過Soring AOP 自動打開 Hibernate Session,啓動事務,執行全部與數據相關的工做,結束事務並關閉Session。模式的關鍵是交易與交易之間的一對一關係 Session。
例子:
public Integer save(One one,Tow tow) { oneDao.save(one); towDao.save(tow); return 1; }
3、分佈式事務
(1)JTA
在應用系統數據量愈來愈大時,系統數據就須要分佈在不一樣的數據庫中,當業務需求在多個數據庫中作原子性操做時就能夠選擇JTA (Java Transaction API),JTA事務比JDBC事務更強大。一個JTA事務能夠有多個參與者,而一個JDBC事務則被限定在一個單一的數據庫鏈接。
(2)JTA原理
不一樣的數據庫有不一樣的數據庫供應商,JTA就是將這個不一樣的數據庫管理起來,統一建立一個原子事務,所有成功即成功,一個不成功就回滾全部的操做(JTA仍是較重量級)
(3)實例
Spring有不少的JTA框架,這裏使用的是atomikos框架,具體代碼請點擊連接查看
4、分佈式消息最終一致性事務
(1)最終一致性
當應用系統數據愈來愈龐大,最終數據的一致性成爲了一個很好的解決方案,即能即時響應,又能很好的完成多個數據操做(但不能保證必定成功,可能過了一段時間最終卻沒有成功)。
(2)實現原理當應用收到請求,應用會先將用戶請求的數據保存到分佈式消息中間件中,作一個保存操做。保存成功後就給用戶返回提交成功信息。接着分佈式消息中間件將請求在發送到不一樣的處理機器上,處理機器收到消息在進行業務處理。好比A給B轉帳,A先提交轉帳信息(已經扣款),而後消息被髮送的分佈式消息中間件上,消息中間件在發送處處理機器上面作處理,轉帳成功後則在給用戶發送轉帳成功信息,不成功則把款退回去。