mysql指引(十):事务的ACID真的是ACID吗?

本篇开始进入事务领域的学习。事务是数据库领域中重要的概念,只不过是在mysql等数据库中进行了实现。但是mysql它们实现这些概念的时候真的是按照数据库学科领域中的概念去实现吗?

事务领域知识设计的范围或者说知识点比较多,面对这么多的知识点自然先要将其串联起来,这样才不至于迷失,故本文第一个目的做知识串联。其次,针对串联中的知识点,做大致的梳理。所以本篇相当于后续几篇的开篇词。

好了废话不多,下面进入主题。


事务领域中,首先想到得肯定是 ACID 四大属性,即原子性、一致性、隔离性、持久性。

重要的第一条认知

ACID 四大属性只是规范,要求数据库遵循这些规范。但是具体实现时,不同的数据库也没有完全按照规范来。

重要的第二条认知

比如 MVVC 或者redo log、undo log 、锁等,它们就是为实现这些规范而生的。


下面我们来看看 innodb 中对于事务规则的理解。

原子性是将事务看成一个整体,既然是一个整体任务,那么该任务肯定就处于两种状态:失败或者成功,没有中间状态。

一致性实际上,是应用层的业务语义在事务的支持下,共同实现了数据库从一个一致的状态迁移到另一个一致的状态,一致性更多的是应用层的属性。

持久性 是事务提交了就会被数据库永久的记录。当然了,如果存储器件全坏了,那持久性自然得不到保证。

最后,隔离性 ,严格的规范定义是一个事务所做的修改在提交之前,对其他事务来说是不可见的(这些事务都访问相同的记录)。但是 ,在 innodb 这边,是弱隔离性。


那么,什么是弱隔离性呢?这就引出了 SQL 标准中定义的 隔离级别,即: READ UNCOMMITTED(未提交读)、READ COMMITTED(提交读)、REPEATABLE READ(可重复读)、SERIALIZABLE(可串行化)。

严格规范中的隔离性,就对应隔离级别中的可串行化(串行执行事务意味着没有对资源的并发争夺,也即意味着性能的低下,执行完一个事务再执行另一个)。

弱隔离性,就对应隔离级别中的其他三项。而综合考虑性能和隔离等级后,实际上常用的隔离级别就是:提交读(又叫不可重复读)和 可重复读。

其中提交读指的是:一个事务在提交之前,对记录所做的任何修改,其他事务都不可见。

可重复读指的是:一个事务执行中,多次读取同样的记录得到的结果是一致的。


可重复读的实现引出了 MVVC 多版本并发控制 。事务的实现又依赖于各种


继续看这四个特性,原子性的实现依赖于 Redo LogUndo Log 这几个日志机制。

持久性实际上也可以他们关联,此外还有其他的一些备份等技术。

至于一致性,从某种程度上来说,其他三种特性结合就是一致性的实现。


小结

综上,可以看到事务领域引出了几个非常重要的知识点,包括MVVC、Redo/Undo、锁、其他的一些技术(比如WAL等)。

所以,后续学习这些概念的时候,就比较清楚他们是来解决什么问题的,有什么作用。

下篇,我们就从 Redo Log 看起。

发布了50 篇原创文章 · 获赞 99 · 访问量 11万+

猜你喜欢

转载自blog.csdn.net/zhou307/article/details/104734466
今日推荐