日期:2014-05-16  浏览次数:20304 次

数据库概念—1、ACID基本概念

百度百科里面也有,大家可以看下。我这里是翻译自Wikipedia上面的解释,会更详尽些。

这个是链接:http://en.wikipedia.org/wiki/ACID

        在计算机科学中,ACID(atomicity[原子性]、consistency[一致性]、isolation[隔离性]、durability[持久性]是保证数据事务可靠的被处理的一系列属性。这里注意一个概念就是事务(transaction),它是指在数据库的上下文里,在数据上的一个简单的逻辑操作。例如,资金从一个银行账号转到另一个账号,即使这个逻辑操作将引起许多改动(一个账号要做借记同时另一个要做信贷),所以看到其实一个事务包括了多个数据操作。

        1、atomicity —— 原子性

        原子性表示一系列操作是不可分离的,也就是一个系列的数据库操作,要嘛都做了,要嘛一个都没做。原子性防止只是对数据库只进行了部分的更新,这往往比直接拒绝一系列的操作产生的问题更大。

        看看关于原子性的例子,当买飞机票的时候需要做两件事情:一个是付款、一个是保留座位,对于旅客来说只有这两种情况:

               a、他即付了钱也保留了座位

               b、他没有付钱也没有保留座位

        作为订票系统它不允许出现一个旅客付了钱但是没有保留座位的或者保留了座位却还没付钱的。

        原子性并不是同其他的三个属性完全正交的(就是和其他三个属性没有牵连的意识),例如当isolation(隔离)失败的时候需要利用原子性来实行回滚操作,同样consistency当出现非法的事务而导致一致性遭到破坏的时候同样要运用atomicity的rollback。

        2、consistency—— 一致性

        一致性模型主要应用与分布式系统中,例如分布式共享内存系统、分布式数据存储系统。当在内存上的操作按照一定的规则进行时系统会给定一个指定的模型。数据一致性模型指定了程序员如何同系统进行通讯,系统必须保证当程序员按照相应的规则进行时,内存必须是保存一致的(内容、地址什么不发生变化)并且对内存操作的结果必须是可预测的。

        在高级语言如c、c++、java,对于维持程序员同系统的这种通讯,一部分采用的是将对内存的操作翻译成低层的操作,低层的操作将保留对内存操作的语义(就是逻辑上的意思,如先后顺序什么的)。为了维系这种通讯,编译器必须重新布置内存操作的指令顺序,并且库中的函数例如pthread_mutex_lock()封装了这种同步需求。

        看个例子,假设下面的情况发生:

         把行X复制到节点M和N上(节点是分布式系统的一个概念,可以理解为不同位置上的存储设备这样)

         客户端A写行X(新的内容)到节点N上面

         一段时间过后,客户端B要从M节点上读取行X

         一致性模型就是要决定是否B看到了A写入的东西

         3、isolation——隔离性

         在数据库系统中,隔离性定义了一个操作对数据库所做的改变如何或者何时可以被其他同时在进行的操作“看到”。

         在ACID这四个属性当中,隔离性是最宽松的一个属性,也就是要求不是那么严格。如果要维持高的隔离性,DBMS要在数据上求其到锁或者使用多版本的一致性控制(Multiversion Concurrency Ctrol ),不过这些会导致一致性的性能下降。

         所以许多DBMS往往提供对事物处理的隔离性基本。这个控制了在选择数据时对数据加锁的程度。对于大部分数据库应用来说,创建的大多数数据库事务可以避免使用高的隔离等级(例如SERIALIZABLE 级别,这个是最高的级别),减少对系统过多的进行加锁操作。程序员需要很仔细的检查分析数据库访问代码,一方面要防止过为宽松的隔离而导致很多不易发现的bug,另一方面也要防止使用级别过高的隔离性而使得死锁的可能性增加。

        依据ANSI/ISO SQL标准,隔离性按高到低有这些级别:Serializable、repeatable reads、read committed、read uncommitted。

        4、durability——持久性

        持久性是保证但事务正确执行后,事务所做的操作将永久有效。比如上面的订票系统,如果系统已经表示座位已经成功订取了,那么该座位将一直处于被订取状况,即便是系统崩溃了。这可以在通知用户已成功操作之前,将事务相关的日志记录保持到非易失存储设备上。

        在分布式系统中,在对外声明该事务已被正确处理前,各个相关的服务器要协调好,这个一般使用 two-phase commit(两个阶段认证) 协议。

        许多DBMS将事务写入事务日志的方式来实现持久性,这样可以通过重新处理的方式来重建在任何失败的操作前的系统状态。只有在事务被写入事务日志后,才被认为可以向用户说明对应的事务被正确操作了。这个很好理解