不可重复读:事务 A 多次读取同一数据,事务 B 在事务A多次读取的过程中,对数据作了更新并提交,导致事务A多次读取同一数据时,结果不一致。幻读:系统管理员A将数据库中所有学生的成绩从具体分数改为ABCDE等级。
一、如何理解SQL的可重复读和幻读之间的区别
不可重复读:事务 A 多次读取同一数据,事务 B 在事务A多次读取的过程中,对数据作了更新并提交,导致事务A多次读取同一数据时,结果不一致。
幻读:系统管理员A将数据库中所有学生的成绩从具体分数改为ABCDE等级,但是系统管理员B就在这个时候插入了一条具体分数的记录,当系统管理员A改结束后发现还有一条记录没有改过来,就好像发生了幻觉一样,这就叫幻读。
小结:两者的共同点是:拿到某一时刻的数据,比如T1到T2的时间段中,我只能看到T1时刻的数据。
两者的不同点是:运用场景不同,解决方式不同。前者是在一致性读场景下,通过事务开始的时候声明一致性视图实现的;后者是在当前读场景下,通过加间隙锁的方式实现“防止幻读”的。
比如,在备份数据库的时候,需要拿到所有表在某一时刻的数据,需要的是可重复读。
可重复度隔离级别下,在事务开始的时候,就确定了一个视图,之后的数据改动对其不可见,从而达到可重读的效果,这个我们称为一致性读。
但是在进行select for update这种当前读的时候,视图就不起作用了,意味着在两次查询中,如果有人插入数据,那么两次读取结果不一致,这就是幻读,解决方法就是通过加间隙锁来防止幻读。
不可重复读的和幻读很容易混淆,不可重复读侧重于修改,幻读侧重于新增或删除。解决不可重复读的问题只需锁住满足条件的行,解决幻读需要锁表。
延伸阅读:
二、Vertica是什么
Vertica是一款基于列存储的MPP(massively parallel processing)架构的数据库。
它可以支持存放多至PB(Petabyte)级别的结构化数据。Vertica是由关系数据库大师Michael Stonebraker(2014 年图灵奖获得者)所创建,于2011年被惠普收购并成为其核心大数据平台软件。Vertica 采用无共享的MPP 架构,基于工业标准的x86 服务器,拥有高可扩展性。Vertica 集群中的所有节点100%对等,集群中没有主节点或其他共享资源。通过增加节点,就可以线性地扩展集群的计算能力和数据处理容量。Vertica 是真正的纯列式数据库,优化器和执行引擎可以忽略表中与查询无关的列。Vertica 不仅仅按列式存储数据,还主动地根据列数据的特点和查询的要求选用优异的算法对数据进行排序和编码压缩,这就极大地降低磁盘I/O 消耗。同时,Vertica 的执行引擎和优化器也是基于列式数据库设计的,编码压缩过的列数据在Vertica 的执行引擎中进行过滤、关联、分组等操作时不需要解反编码,从而大大降低了CPU 和内存消耗。