最近在看Elasticsearch时看到了并发控制,由此看到了新的并发控制方式。不得不说Elasticsearch相较于关系型数据库就是两种理论创建的数据存储体系,固然它们在并发控制上也相差甚远,各有千秋。
数据库
说到并发就不得不提一下串行,所谓串行就是数据库操做事物按照特定的顺序从上到下执行,在串行操做某个数据表的某个字段的值时写入和读取都很好理解,且不会发生异常。可是每每线上数据操做会发生各类异常,由于线上数据库对用户来讲不多是串行访问的,每每是并发访问。就会产生如写入并发形成的覆盖现象,读写并发形成的脏读现象等。下面简单介绍一下这些异常造成的缘由。并发
A获取字段X的值为3将它减1而后写入数据库X为2,当B在A写入以前同时获取X的值为3将它减1而后写入数据库X为2。
能够看到上面X通过两次减1操做,可是它的值只减了1,由于B将A的操做覆盖了。测试
若是X的值为1,A想将X的值减1,若是X等于0则返回,当A将减1操做执行完成前,B一样进行这个操做,B取到的X也等于1,而后执行减1操做,会是X的值变为-1。线程
上面的例子说明了并发操做中存在冲突,须要一种机制来处理这种冲突。因而锁的机制就应运而生来。锁顾名思义就是将须要执行的数据锁起来,从而让他从并发变成串行。
设计
悲观锁对数据被修改持悲观态度。即每次获取数据的时候,都会担忧数据被修改,因此每次获取数据的时候都会进行加锁,确保在本身使用的过程当中数据不会被别人修改,使用完成后进行数据解锁。因为数据进行加锁,期间对该数据进行读写的其余线程都会进行等待。
事务
在数据库中,锁被设计为两种模式,即共享锁(读锁)和互斥锁(写锁)。当一个事物得到共享锁以后,它只能进行读操做;当一个事物获取一行数据当互斥锁时,就能够对该行数据进行读和写操做。
多个事物能够同时获取同一行数据的共享锁,但互斥锁同一时间只能被一个事物获取。没有得到锁但事物将处于等待状态。
ast
两阶段锁协议是一种可以保证事物可串行化但协议,它将事物的获取锁和释放锁分红增加和缩减两个不一样的阶段。在增加阶段,一个事物能够得到锁可是不能释放锁;而在缩减阶段事物只能够释放锁,不能获取新的锁。变量
乐观锁并非真正的锁,而是一种并发控制的思想。它能够基于各类协议来实现这种并发控制。不一样的事物按照锁协议同一数据项依次执行,由于后面执行的事务想要获取的数据已经被前面的事务加锁,只能等待锁的释放。
时间戳
每一个事务都有一个全局惟一且随时间递增的时间戳。每一项数据有两个时间戳分别是读时间戳和写时间戳,分别表明事务的开始和结束。这个协议使不管读操做仍是写操做都须要比较读写时间戳,若是小于当前值(最后一次操做都时间戳)就会拒绝,而后回滚,而后数据库给这个事务一个新的时间戳从新执行。
数据
这个协议根据事务的只读或者更新将全部事务的执行分为两到三个阶段。
在读阶段,数据库会执行事务中的所有读操做和写操做,并将因此写后的值村润临时变量中,并不会真正更新数据库的内容;而后进入下一阶段,数据库会检测当前改动是否合法,便是否有其余事务在读阶段更新了数据,若是经过测试就直接写入数据库,不然就拒绝执行。
多版本并发控制意味着更新数据时不覆盖原数据,而是在数据库中保留多个版本,根据须要使用某个版本。它本质上跟上面的不冲突,属于两种解决方案,它并不能解决冲突而是将冲突分割开。