傳統的本地事務處理都是依靠數據庫自身事務處理能力,而事務自己是傳統關係型數據庫的基石。簡單來講事務就是一些知足acid特性的sql,數據庫經過鎖和日誌實現這些機制。國內的mysql中innodb事務引擎引料衆多,也有不少文章讓咱們深入理解索引和事務的概念。此處簡單說一下個人理解;java
A:表明原子性,最好理解,要麼全作,要麼全不作。mysql
C:一致性,簡單來講就是你扣了50,有人就加了50(一致性自己存在好多種類,傳統理解數據庫是強一致性)程序員
I:隔離性,事務之間的可見行,提及來很抽象,其實看看4中隔離性級別,作個實驗,就很好理解了。好比市面上大多數數據庫默認隔離性級別是讀已提交數據,因此只有其餘事務提交以後的更新你才能感知到。算法
可是這裏面有個好玩,也是核心交易建立支付單用來判重用的,若是一個事務A插入一條數據,另一個事務B插入同一條數據(主鍵相同),即便另一個事務沒提交,也會抱主鍵衝突。這個很好玩。能夠實驗嘗試。spring
D:持久性,一旦提交,不會丟失。可是誰能保證必定不會丟失呢,天災人禍。其實這一點,就是把事務日誌提交持久化redo日誌中,即便斷電,內存中數據沒有持久化到磁盤,利用redo日誌恢復,咋恢復的,之前學習用的ARIES Recovery Algorithm。sql
對於java 程序員而言,是不須要直接使用那些sql操做數據庫的,咱們使用jdbc, 每一個數據庫廠商都會爲一些編程語言提供驅動,聽起來高端,其實就是一個跟數據庫通訊的api ,內部經過數據庫本身的協議通訊。jdbc是一個標準接口,每一個廠商各自實現,而後對於不一樣的數據庫咱們操做起來基本相同。架構以下圖,最重要的就是這個Connection,我特意作了試驗,想知道它什麼東西。在msyql中show processlist 能夠查看當前執行的線程,發現其實每一個Connection對應一個處理線程,提交事務和回滾事務都是這個Connection處理,固然發送sql和接收結果集合都是它。因此本地事務處理仍是靠數據庫自己。數據庫
jdbc驅動的架構編程
jdbc驅動要實現的接口都在jdk中的rt.jar中的package java.sql,idea的中的工具能夠直接查看包內的類直接關係,很爽。看下圖,固然還有另一個圖,是sql相關的異常,一個項目如何設置一個規範的異常體系,後期花時間總結。api
spring 的事務管理最終仍是須要依賴數據庫自身事務管理,可是它在業務層提供了一個很重要的功能就是事務的傳播性。很好玩,通常在開發過程當中,我門都是是用默認的傳播機制。架構
CAP:
BASE :
一致性協議: 兩階段,三階段,paxos方法(zookeeper基於此實現,太複雜不學),raft(號稱簡單而容易實現的一致性算法,準備細緻的看看)