传统的本地事务处理都是依靠数据库自身事务处理能力,而事务自己是传统关系型数据库的基石。简单来讲事务就是一些知足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(号称简单而容易实现的一致性算法,准备细致的看看)