目前关于事务的几大理论包括:ACID特性(数据库的特性),CAP分布式理论,以及BASE等。数据库
一、A(原子性):一个事务包含多个操做,这些操做要么所有执行,要么全都不执行;实现事务的原子性,要支持回滚操做,在某个操做失败后,回滚到事务执行以前的状态。网络
二、C(一致性):一致性是指事务使得系统从一个一致的状态转换到另外一个一致状态,保证数据的完整性。事务的一致性决定了一个系统设计和实现的复杂度,也致使了事务的不一样隔离级别。并发
三、I(隔离性):保证事务不受外部并发操做,在独立环境执行。多个并发的事务同时访问一个数据库时,一个事务不该该被另外一个事务所干扰,每一个并发的事务间要相互进行隔离。框架
四、D(持久性):指一个事务一旦被提交了,那么对数据库中的数据的改变是永久的,即使是在数据库系统遇到故障的状况下也不会丢失提交事务的操做。异步
一、C(一致性):在分布式环境下,一致性是指多个节点数据是否一致;分布式
二、A(可用性):服务一直保持可用的状态,当用户发出一个请求,服务能在必定的时间内返回结果;不少中间件或者开源框架都支持高可用方案(Redis、Zookeeper等);性能
三、P(分区容忍性):特指对网络分区的容忍性;分布式系统在遇到任何的 网络分区(分布式系统中不一样节点部署在不同的网络环境) 故障的时候,仍然须要保证对外提供知足一致性和可用性的服务设计
BA: Basic Availability 基本业务可用性;日志
S: Soft state 柔性状态;中间件
E: Eventual consistency 最终一致性;
一、在事务并发操做时,可能出现的问题有以下三种:
补充 MVCC:多版本并发控制。是一种并发控制的方法,你们应该知道,锁机制能够控制并发操做,可是系统开销比较大(悲观锁),而MVCC(乐观锁)能够在大多数状况下代替行级锁,能够下降系统开销。 在MYSQL中,MyISAM使用的是表锁,InnoDB使用的是行锁。而InnoDB的事务分为四个隔离级别,其中默认的隔离级别REPEATABLE READ须要两个不一样的事务相互之间不能影响,并且还能支持并发,这点悲观锁是达不到的,因此REPEATABLE READ采用的就是乐观锁,而乐观锁的实现采用的就是MVCC。正是由于有了MVCC,才造就了InnoDB强大的事务处理能力
乐观锁读写事务,在真正的提交以前,不加读/写锁,而是先看一下数据的版本/时间戳,等到真正提交的时候再看一下版本/时间戳,若是两次相同,说明别人期间没有对数据进行过修改,那么就能够放心提交
二、针对事务并发致使的问题,经过事务隔离来解决,事务隔离级别从低到高以下:
一般,在项目为了性能的考虑会对隔离性进行折中
一、两阶段提交:
在两阶段提交中,系统分为两类节点:协调者和参与者
(1)请求阶段(决策阶段):协调者将通知事务参与者准备提交或取消事务,而后进入表决过程;在表决过程当中,参与者将告知协调者本身的决策:赞成(事务参与者本地做业执行成功)或取消(本地做业执行故障)
(2)提交阶段:在该阶段,协调者将基于第一个阶段的投票结果进行决策:提交或取消。 当且仅当全部的参与者赞成提交事务协调者才通知全部的参与者提交事务,不然协调者将通知全部的参与者取消事务。 参与者在接收到协调者发来的消息后将执行响应的操做
缺点:
全部两阶段提交没法解决的问题就是:没法保证事务执行的完整性(数据的一致性)
二、三阶段提交:
与两阶段提交协议的区别:三阶段提交协议在协调者和参与者之间引入了超时机制; 在2PC的准备阶段和提交阶段之间,插入预提交阶段,使3PC拥有CanCommit、PreCommit、DoCommit三个阶段。 PreCommit是一个缓冲,保证了在最后提交阶段以前各参与节点的状态是一致的
(1)CanCommit阶段:3PC的CanCommit阶段其实和2PC的准备阶段很像。 协调者向参与者发送commit请求,参与者响应是否能够提交。
(2)PreCommit阶段:协调者根据参与者的响应状况来决定是否能够继续事务的PreCommit操做
(3)DoCommit阶段:该阶段进行真正的事务提交
缺点:若是进入PreCommit后,协调者发出的是abort请求,假设只有一个参与者收到并进行了abort操做, 而其余对于系统状态未知的参与者会根据3PC选择继续Commit,此时系统状态发生不一致性
分布式系统的一个难点就是:“网络通讯的不可靠”,只能经过“确认机制”、“重试机制”、“补偿机制”等各方面来解决一些问题。在综合考虑可用性、性能、实现复杂度等各方面的状况上,比较好的选择是“异步确保最终一致性”(确认机制),只是具体实现方式上有一些差别