事务 ACID
事务 (Transaction): 是由一组 SQL 语句组成的程序执行单元 (Unit), 它需要满足 ACID 特性.
- 原子性(Atomicity)
事务是一个不可再分割的工作单元,事务中的操作要么都发生,要么都不发生。
- 一致性(Consistency)
数据库事务不能破坏关系数据的完整性以及业务逻辑上的一致性。
- 隔离性(Isolation)
多个事务并发访问时,事务之间是隔离的,一个事务不应该影响其它事务运行效果。
- 持久性(Durability)
在事务完成以后,该事务所对数据库所做的更改便持久的保存在数据库之中,并不会被回滚
数据库模型
3种数据模型,最终关系型模型成为了应用最为广泛的数据库模型。
- 网状模型:用有向图表示实体和实体之间的联系的数据结构模型称为网状数据模型。
- 层次模型:层次数据模型是用树状<层次>结构来组织数据的数据模型。
- 关系模型:使用表格表示实体和实体之间关系的数据模型称之为关系数据模型。
| 网状模型 | 层次模型 | 关系模型 | |
|---|---|---|---|
| 优势 | 能直接描述现实世界 存取效率较高 | 结构简单 查询效率高 可以提供较好的完整性支持 | 实体及实体间的的联系都通过二维表结构表示 可以方便的表示M:N关系 数据访问路径对用户透明 |
| 劣势 | 结构复杂 用户不易使用 访问程序设计复杂 | 无法表示M:N的关系 插入、删除限制多 遍历子节点必须经过父节点 访问程序设计复杂 | 关联查询效率不够高 关系必须规范化 |
SQL 发展历程
SQL(Structured Query Language)是一种用于管理和操作关系型数据库的语言。它的发展历程可以分为以下几个阶段:
-
早期关系型数据库系统(1970s - 1980s): SQL的起源可以追溯到20世纪70年代初期,当时IBM的研究员Edgar F. Codd提出了关系型数据库的概念,并在1970年发表了论文《关系数据模型:数据库的规范化与逻辑结构》。这奠定了关系型数据库的理论基础。在此基础上,IBM于1979年发布了第一个商用关系型数据库管理系统(RDBMS)——IBM System R,它是SQL的早期实现之一。
-
SQL的标准化(1986 - 1987): 随着关系型数据库的发展,对于一个统一的查询语言的需求逐渐增加。ANSI(美国国家标准学会)于1986年发布了第一个SQL标准,称为SQL-86。这一标准定义了SQL的基本语法和操作。
-
SQL的演进与竞争(1980s - 1990s): 在SQL-86之后,不同数据库厂商开始开发自己的SQL实现,因此出现了多种不同版本的SQL。随着时间的推移,针对不同的需求和特性,各种数据库系统逐渐发展出自己的扩展功能。例如,IBM的DB2、Oracle Database、Microsoft的SQL Server等都是在这个时期逐步崭露头角的数据库系统。
-
SQL标准的持续发展(1990s - 至今): SQL标准并不是一成不变的,而是随着时间不断演进的。ANSI和国际标准化组织ISO(国际标准化组织)共同推动了SQL标准的不断更新。一些重要的SQL标准版本包括SQL-92、SQL:1999、SQL:2003、SQL:2008等。每个新版本都引入了新的语法、功能和特性,以满足不断变化的数据库需求。
-
NoSQL和新型数据库(2000s - 至今): 随着互联网的兴起,一些应用场景出现了关系型数据库无法有效处理的大规模、高速、分布式数据。这促使了NoSQL(Not Only SQL)运动的兴起,提供了各种不同类型的非关系型数据库,如文档数据库、列存储数据库、键值存储数据库等。这些数据库系统通常更适合特定的应用场景,但并没有取代传统的关系型数据库。
总的来说,SQL作为关系型数据库管理系统的核心查询语言,经历了从概念到标准化再到不断发展的过程。同时,随着新的技术和需求的出现,数据库领域也出现了多种类型的数据库系统,形成了多样化的数据库生态系统。
3、SQL语言
SQL引擎包括了:
- Paser:经过词法分析、语法分析生成语法树,然后对语法树进行合法性校验。
- Optimizer:根据Parser产生的语法树,根据规则或者代价产生执行计划树。
- Executor:根据计划树进行执行,常见的执行方式是火山模型。
事务引擎:
MVCC(多版本并发控制) 实现原理
记录中的隐藏字段 最近修改事务ID 回滚指针 隐藏主键。 readview快照
这里readview有 ReadView包含的内容 m_ids 。在生成ReadView时,当前系统中活跃的读写事务的事务id列表,即还未提交。 min_trx_id 。在生成ReadView时,当前系统中活跃的读写事务中最小的事务id;也就是m_ids中 的最小值。 max_trx_id 。在生成ReadView时,系统应该分配给下一个事务的事务id值。 creator_trx_id 。生成该ReadView的事务的事务id。