1.2.1 操作型系统
相信从事过IT或相关工作的读者对操作型系统都不会感到陌生,几乎所有的互联网线上系统、MIS、OA等都属于这类系统的应用。操作型系统是一类专门用于管理面向事务的应用的信息系统。“事务”一词在这里存在一些歧义,有些人理解事务是一个计算机或数据库的术语,另一些人所理解的事务是指业务或商业交易,这里使用前一种语义。那么什么是数据库技术中的事务呢?这是首先需要明确的概念。
事务是工作于数据库管理系统(或类似系统)中的一个逻辑单元,该逻辑单元中的操作被以一种独立于其他事务的可靠方式所处理。事务一般代表着数据改变,它提供“all-or-nothing”操作,就是说事务中的一系列操作要么完全执行,要么完全不执行。在数据库中使用事务主要出于两个目的:
● 保证工作单元的可靠性。当数据库系统异常宕机时,其中执行的操作或者已经完成或者只有部分完成,很多没有完成的操作此时处于一种模糊状态。在这种情况下,数据库系统必须能够恢复到数据一致的正常状态。
● 提供并发访问数据库的多个程序间的隔离。如果没有这种隔离,程序得到的结果很可能是错误的。
根据事务的定义,引申出事务具有原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)的特点,也就是数据库领域中常说的事务的ACID特性。
● 原子性
数据库系统的原子性指的是事务中的一系列操作或全执行或不执行,这些操作是不可再分的。原子性可以防止数据被部分修改。银行账号间转账是一个事务原子性的例子。简单地说,从A账号向B账号转账有两步操作:A账号提取,B账号存入。这两个操作以原子性事务执行,使数据库保持一致的状态,即使这两个操作的任何一步失败了,总的金额数不会减少也不会增加。
● 一致性
数据库系统中的一致性是指任何数据库事务只能以允许的方式修改数据。任何数据库写操作必须遵循既有的规则,包括约束、级联、触发器以及它们的任意组合。一致性并不保证应用程序逻辑的正确性,但它能够保证不会因为程序错误而使数据库产生违反规则的行为。
● 隔离性
在数据库系统中,隔离性决定了其他用户所能看到的事务完整性程度。例如,一个用户正在生成一个采购订单,并且已经生成了订单主记录,但还没有生成订单条目明细记录。此时订单主记录能否被其他并发用户看到呢?这就由隔离级别决定。在数据库系统中,按照由低到高一般有读非提交、读提交、可重复读、串行化等几种隔离级别。数据库系统并不一定实现所有的隔离级别,如Oracle数据库只实现了读提交和串行化,而MySQL、PostgreSQL数据库则提供全部四种隔离级别。
隔离级别越低,多用户并发访问数据的能力越高,但同时也会增加脏读、丢失更新等并发操作的负面影响。相反,高隔离级降低了并发影响,但需要使用更多的系统资源,也增加了事务被阻塞的可能性。
● 持久性
数据库系统的持久性保证已经提交的事务是永久保存的。例如,如果一个机票预订报告显示一个座位已经订出,那么即使系统崩溃,被订出的座位也会一直保持被订出的状态。持久性可以通过在事务提交时将事务日志刷新至永久性存储介质来实现。
了解了事务的基本概念后,我们再来看操作型系统就比较容易理解了。操作型系统通常是高并发、低延迟的系统,具有大量检索、插入、更新操作,事务数量大,但每个事务影响的数据量相对较小。这样的系统很适合在线应用,这些应用有成千上万用户在同时使用,并要求能够立即响应用户请求。操作型系统常被整合到面向服务的架构(SOA)和Web服务里。对操作型系统应用的主要要求是高可用、高速度、高并发、可恢复和保证数据一致性,在各种互联网应用层出不穷的今天,这些系统要求是显而易见的。
1.操作型系统的数据库操作
在数据库使用上,操作型系统常用的操作是增、改、查,并且通常是插入与更新密集型的,同时会对数据库进行大量并发查询,而删除操作相对较少。操作型系统一般都直接在数据库上修改数据,没有中间过渡区。
2.操作型系统的数据库设计
操作型系统的特征是大量短的事务,并强调快速处理查询。每秒事务数(TPS)是操作型系统的一个有效度量指标。针对以上这些特点,数据库设计一定要满足系统的要求。
在数据库逻辑设计上,操作型系统的应用数据库大都使用规范化设计方法,通常要满足第三范式。这是因为规范化设计能最大限度地减少数据冗余,因而提供更快更高效的方式执行数据库写操作。关于规范化设计概念及其相关内容,将会在第2章“数据仓库设计基础”中作详细说明。
在数据库物理设计上,应该依据系统所使用的数据库管理系统的具体特点,做出相应的设计,毕竟每种数据库管理系统在实现细节上存在很大差异。下面就以Oracle数据库为例,简要说明在设计操作型系统数据库时应该考虑的问题。
● 调整回滚段。回滚段是数据库的一部分,其中记录着最终被回滚的事务的行为。这些回滚段信息可以提供读一致性、回滚事务和数据库恢复。
● 合理使用聚簇。聚簇是一种数据库模式,其中包含共用一列或多列的多个表。数据库中的聚簇表用于提高连接操作的性能。
● 适当调整数据块大小。数据块大小应该是操作系统块大小的倍数,并且设置上限以避免不必要的I/O。
● 设置缓冲区高速缓存大小。合理的缓存大小能够有效避免不必要的磁盘I/O。
● 动态分配表空间。
● 合理划分数据库分区。分区最大的作用在于可用性和可维护性,使得数据维护期间保持事务处理的性能。
● SQL优化。有效利用数据库管理系统的优化器,使用最佳的数据访问路径。
● 避免过度使用索引。大量的数据修改会给索引维护带来压力,从而对整个系统的性能产生负面影响。
以上所讲的操作型系统都是以数据库系统为核心,而数据库系统为了保持ACID特性,本质上是单一集中式系统。在当今这个信息爆炸的时代,集中式数据库往往已无法支撑业务的需要(从某订票网站和某电商网站的超大瞬时并发量来看,这已是一个不争的事实)。这就给操作型系统带来新的挑战。分布式事务、去中心化、CAP与最终一致性等一系列新的理论和技术,为解决系统扩展问题应运而生。这是一个很大的话题,要想说清楚需要很多的扩展知识和大量篇幅,故这里只是点到为止,不做展开。