什么是事务?
事务是数据库系统中的核心机制。我们要理解下事务概念:什么是事务呢?事务是并发控制的单位,是用户定义的一个操作序列。有四个特性(ACID):
原子性(Atomicity): 事务是数据库的逻辑工作单位,事务中包括的诸操作要么全做,要么全不做;
一致性(Consistency): 事务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态。一致性与原子性是密切相关的;
隔离性(Isolation): 一个事务的执行不能被其他事务干扰;
持续性/永久性(Durability): 一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。
以上是书面解释,简单来说就是把你的操作统一化,要么所有操作都成功,要么就都不成功,如果执行中有某一项操作失败,其之前所有的操作都回滚到未执行这一系列操作之前的状态。
同时事务拥有三种隔离级别,分别是脏读、幻读、不可重复读。分别理解下几个的含义。
脏读
A事务读取B事务尚未提交的数据,此时如果B事务发生错误并执行回滚操作,那么A事务读取到的数据就是脏数据。就好像原本的数据比较干净、纯粹,此时由于B事务更改了它,这个数据变得不再纯粹。这个时候A事务立即读取了这个脏数据,但事务B又用回滚把数据恢复成原来干净、纯粹的样子,而事务A却什么都不知道,最终结果就是事务A读取了此次的脏数据,称为脏读。
这种情况常发生于转账与取款操作中:
幻读(前后多次读取,数据总量不一致)
事务A在执行读取操作,需要两次统计数据的总量,前一次查询数据总量后,此时事务B执行了新增数据的操作并提交后,这个时候事务A读取的数据总量和之前统计的不一样,就像产生了幻觉一样,平白无故的多了几条数据,成为幻读。
不可重复读(前后多次读取,数据内容不一致)
事务A在执行读取操作,由整个事务A比较大,前后读取同一条数据需要经历很长的时间 。而在事务A第一次读取数据,比如此时读取了小明的年龄为20岁,事务B执行更改操作,将小明的年龄更改为30岁,此时事务A第二次读取到小明的年龄时,发现其年龄是30岁,和之前的数据不一样了,也就是数据不重复了,系统不可以读取到重复的数据,成为不可重复读。
因此数据库系统中需要一种事务机制从而可以解决数据库基本操作读、写所带来的各种一致性问题。保证数据的正确性便是数据库系统最基本也是最重要的课题了。
数据事务对多维数据库的意义
元年多维数据库需要一种简单、稳定高效且极易扩展的事务机制,最基础的功能便是要实现及达到读写分离的目的,读不能影响写,写的同时也不能影响读。
根据多维数据库特有的模型及建模特点,并结合参考MVCC的原理,设计出一种适合元年多维数据库的事务机制。
这种事务机制是可以保证数据库的所有操作都是事务性的,同时也是可以保证事务的ACID特性的,同时对事务的回滚也有相应的处理。是一种最简单,安全可靠的事务机制,同时结合多维的特点,对数据和元对象做了事务的隔离解耦,保证了未来的高扩展性。
通过以上机制变可以实现一个简单且稳定的事务机制。这种事务机制结合了多维模型的特点,同时对于OLAP中大量的读操作是可以达到并行处理的目的的,即当用户在数据库中做任何的写操作时不会影响读的操作,同时任何读也不会去影响写的行为。例如当用户在某个时间对某段数据做了修改,那么在该时间之前发生的读操作一定是获取了修改之前的数据,当在修改之后发生的读操作,那么获取一定是修改完成后的数据了。
事务是一切数据库必备的基石,没有这个基石,那么一切数据库的功能,一切数据库的业务处理都会变得没有任何意义,因为丧失了数据的一致性,因此事务主要的目的之一就是解决了数据的一致性问题。
在项目上事务的成功表现
在华为项目上元年内存多维数据库被客户在预算产品线,合并产品线等多个产品线上频繁使用,期间会有大量的用户同时在线进行了频繁的读写操作,在这些频繁的读写操作中,数据信息正确,没有发生过一次数据错乱现象,同国外的同类型数据库产品相比毫不逊色,同时在某些场景的读写上性能表现更好,让用户体验更舒服。正是由于事务这种基础机制的表现才可以让元年内存多维数据表现的如此稳定。在所有的基础软件的成功应用下,必然隐藏着安全、稳定可靠的各种基础组件。因此事务是数据库系统中的三大基础组件之一是非常重要的。