1 绪论
1.1术语
- 数据(Data)
- 数据库(DataBase,DB)
- 数据库管理系统(DataBase Management System,DBMS)
- 数据库系统(DataBase System,DBS)
- 由DB,DBMS,DBA组成
1.2 概念
- 数据模型(Data Model)
-
分类
- 概念模型:对数据和信息进行建模,用于设计数据库;E-R图
- 逻辑模型:用于数据库管理系统的实现;主要包括层次模型、网状模型、关系模型、面向对象模型和对象关系数据模型等
- 物理模型:描述数据在系统内部的表示方法和存取方法,在磁盘或磁带上的存储方式和存取方法
-
数据模型的组成要素
- 数据结构:描述数据库的组成对象以及对象之间的联系
- 数据操作:指对数据库中各种对象的实例允许执行的操作的集合,包括操作及其有关的规则,主要分为查询和更新(插入、删除、修改)两大类操作
- 完整性约束条件:给定的数据模型中数据及其联系所具有的制约和依存规则,在关系模型中体现为实体完整性和参照完整性。
-
- 逻辑模型的分类
- 非关系模型
- 层次模型(Hierarchical Model):
- 有且只有一个结点没有双亲结点,这个结点称为根结点
- 根以外的其它结点有且只有一个双亲结点
- 网状模型(Network Model)
- 允许一个以上的结点无双亲;
- 一个结点可以有多于一个的双亲。
- 层次模型(Hierarchical Model):
- 关系模型
- 关系:一个关系对应通常说的一张表。
- 属性:表中的一列即为一个属性。
- 域:属性的取值范围。
- 元组:表中的一行即为一个元组。
- 码:也称码键。表中的某个属性组,它可以唯一确定一个元组。
- 分量:元组中的一个属性值。
- 关系模式:对关系的描述,一般表示为 关系名
- 非关系模型
- E-R图
组成
- 实体型:用矩形表示,矩形框内写明实体名
- 属性:用椭圆表示,并用无向边将其与相应的实体型连接起来
- 联系:用菱形表示,菱形框内写明联系名,并用无向边分别与有关实体型连接起来,同时标明联系的类型(1:1, 1:n, m:n)–实体的数量对应关系
- 数据库系统结构
数据库系统的三级模式结构
- 模式(Schema):
- 全体数据的逻辑结构和特征的描述
- 所有用户的公共数据视图,综合了所有用户的需求
- 模式的结构地位:是数据库系统模式结构的中间层
- 与数据的物理存储细节和硬件环境无关;与具体的应用程序、开发工具及高级程序设计语言无关
- 外模式(External Schema)
- 数据库用户(包括应用程序员和最终用户)使用的局部数据的逻辑结构和特征的描述
- 数据库用户的数据视图,是与某一应用有关的数据的逻辑表示
- 外模式的用途:①保证数据库安全性的一个有力措施 ②每个用户只能看见和访问所对应的外模式中的数据
- 内模式(Internal Schema)
- 是数据物理结构和存储方式的描述
- 是数据在数据库内部的表示方式:
- 记录的存储方式(顺序存储,按照B树结构存储,按hash方法存储)
- 索引的组织方式
- 数据是否压缩存储
- 数据是否加密
- 数据存储记录结构的规定
2 关系数据库
关系模型是由关系数据结构、关系操作集合、关系完整性约束三部分组成的
2.1 关系数据结构及形式化定义
- 1.域(Domain):域是一组具有相同数据类型的值的集合
- 2.笛卡尔积(Cartesian Product):笛卡尔积是域上面的一种集合运算
- 每个元素(d1,d2,…dn)称为一个n元组或简称元组
- 笛卡尔积可表示为一个二维表,表中每行对应一个元组,表中每一列的值来自一个域
- 3.关系(Relation):笛卡尔积(D1×D2×…×Dn)的子集叫作在域D1,D2,…,Dn上的关系;关系也是一个二维表,每行对应一个元组,每列对应一个域,每列称为属性
- 候选码(Candidate key):关系中的某一属性组的值能唯一地标识一个元组,则称该属性组为候选码
- 主码(Primary key):若一个关系有多个候选码,则选定其中一个或多个为主码
- 主属性(Prime attribute)与非主属性:候选码的多个属性称为主属性(Prime attribute),不包含在任何候选码中的属性称为非主属性
- 全码(All-key):最简单的情况下,候选码只包含一个属性,如果关系模式的所有属性都是这个关系的候选码,则称为全码(All-key)
2.2 关系操作
- 查询(Query)操作
- 查询操作又分为:选择(Select)、投影(Project)、连接(Join)、除(Divide)、并(Union)、差(Except)、交(Intersection)、笛卡尔积等
- 选择、投影、并、差、笛卡尔积是5种基本操作,其他操作是可以用基本操作来定义和导出的
- 插入(Insert)、删除(Delete)、修改(Update)操作
2.3 关系的完整性
对关系的某种约束条件
- 实体完整性(Entity Integrity):关系模型以主码作为唯一性标识,主码中的属性即主属性不能取空值
- 参照完整性(Referential Integrity):外码
- 用户自定义完整性(User-defined Integrity):反映某一具体应用所涉及的数据必须满足的语义要求
2.4 关系代数
-
选择:选择运算是从关系R中选取使逻辑表达式F为真的元组,是从行的角度进行的运算
-
投影:投影操作主要是从列的角度进行运算,但投影成功之后不仅取消了原关系中的某些列,而且还可能取消某些元组(避免重复行)
-
连接:从两个关系的笛卡尔积中选取属性间满足一定条件的元组
- 等值连接:θ为’=’的连接运算称为等值连接,即选取属性相等的元组
- 自然连接:特殊的等值连接,两个关系中进行比较的分量必须是相同的属性组,在结果中要把重复的属性列去掉
- 一般连接:操作是从行的角度进行运算的,自然连接还需要取消重复列,所以是同时从行和列的角度进行运算
-
悬浮元组与外连接:
- 悬浮元组:两个关系R和S在做自然连接时,关系R中某些元组有可能在S中不存在公共属性上值相等的元组,从而造成R中这些元组在操作时被舍弃了,这些被舍弃的元组称为悬浮元组
- 外连接(OUTER JOIN):如果把悬浮元组也保存在结果关系中,而在其他属性上填空值(Null),就叫做外连接
- 左外连接(LEFT OUTER JOIN或LEFT JOIN):只保留左边关系R中的悬浮元组
- 右外连接(RIGHT OUTER JOIN或RIGHT JOIN):只保留右边关系S中的悬浮元组
-
除:除操作是同时从行和列的角度进行运算的
3 SQL
3.1 基本概念
- 内模式:一个(或多个)基本表对应一个存储文件,一个表可以带若干索引,索引也存放在存储文件中。
- 模式:SQL中一个关系就对应一个基本表
- 外模式:视图是从一个或几个基本表导出的表
3.2 专有名词及解释
- 索引:建立索引是加快查询速度的有效手段
-
索引是关系数据库的内部实现技术,属于内模式的范畴。
-
唯一索引:使用UNIQUE关键字,每个索引值对应唯一一条数据记录
-
非唯一索引:不使用UNIQUE关键字
-
聚簇索引:指索引项的顺序与表中记录的物理顺序一致的索引组织,可以在最经常查询的列上建立聚簇索引,对于经常更新的列不宜建立聚簇索引。一个表只能建立一个聚簇索引,一般默认是主键
- B+树结构,InnoDB
- 主键顺序插入,自增id
- 更新主键的代价很高
- 二级索引(辅助索引)访问需要经过两次查找
-
视图:视图是从一个或几个基本表(或视图)导出的表,数据库只存放视图的定义而不存放视图对应的数据,这些数据仍存放在原来的基本表中。
- 简化用户的操作
- 以多种角度来观察同一数据
- 对重构数据库提供了一定的逻辑独立性
- 对机密数据提供安全保护
- 利用视图可以更清晰地表达查询语句
-
3.3 数据定义
- 1.创建/删除数据库
- 2.创建/删除/修改基本表
- 3.主键和外键
- 4.建立索引
3.4 数据查询
- 单表查询
- 选择表中的若干列
- 选择表中的若干元组
- 使用DISTINCT关键字消除重复的行
- 使用WHERE查询满足条件的元组
- 多重条件查询,逻辑运算符AND 和 OR 可用来联结过个查询条件,AND的优先级高于OR,但可用括号改变优先级
- ORDER BY子句
- 聚集函数
- GROUP BY子句
- 连接查询
- 等值与非等值连接查询,自然连接
- 自身连接
- 外连接
- 复合条件连接
- 嵌套查询和集合查询
- 带有IN谓词的子查询
- 带有比较运算符的子查询
- 带有ANY(SOME)或ALL谓词的子查询
- 带有EXISTS谓词的子查询
- 集合查询:集合操作包括并操作UNION、交操作INTERSECT和差操作EXCEPT,参加集合操作的各查询结果的列数必须相同,对应项的数据类型也必须相同。
- 数据更新
- 插入数据
- 修改数据
- 删除数据
- 视图
4 数据库安全性
4.1 专有名词及解释
- 数据库管理员:拥有所有对象的所有权限
- 用户:拥有自己建立的对象的全部的操作权限,可以使用GRANT,把权限授予其他用户
- 角色:数据库角色是权限的集合,一组拥有相同权限的用户的抽象分类
- 审计:启用一个专用的审计日志(Audit Log),将用户对数据库的所有操作记录在上面
4.2 用户标识与鉴别(Identification & Authentication
- 存取控制
- 定义用户权限,并将用户权限登记到数据字典中
- 合法权限检查:每当用户发出存取数据库的操作请求后,DBMS查找数据字典,根据安全规则进行合法权限检查。
- 自主存取控制(Discretionary Access Control,DAC)
- 用户对于不同的数据库对象有不同的存取权限,不同的用户对同一对象也有不同的权限
- 用户还可以将其拥有的存取权限转授给其他用户(通过SQL的GRANT语句和REVOKE语句)
- 强制存取控制(Mandatory Access Control,MAC)
- 更高程度的安全性
- 主体:系统中的活动实体,DBMS所管理的实际用户,代表用户的各进程
- 客体:系统中的被动实体,受主体操纵,如:文件、基表、索引、视图
- 敏感度标记
- 绝密(Top Secret,TS)
- 机密(Secret,S)
- 可信(Confidential,C)
- 公开(Public,P)
- 主体的敏感度标记称为许可证级别(Clearance Level)
- 客体的敏感度标记称为密级(Classification Level)
- 存取规则
- 仅当主体的许可证级别大于或等于客体的密级时,该主体才能读取相应的客体
- 仅当主体的许可证级别小于或等于客体的密级时,该主体才能写相应的客体
- 更高程度的安全性
5 数据库完整性
数据库完整性是指数据的正确性和相容性。完整性是为了防止数据库中存在不符合语义的数据,即防止数据库中存在不正确的数据。
- 1.提供定义完整性约束条件的机制
- 2.提供完整性检查的方法:检查数据是否满足完整性约束条件的机制
- 3.违约处理:若用户违背了完整性约束条件,应该采取的动作
5.1 实体完整性
- 关系模型的实体完整性在CREATE TABLE中用PRIMARY KEY定义。
- 一种是定义为列级约束条件
- 另一种是定义为表级约束条件
- 违约处理
- 检查主码值是否唯一,如果不唯一则拒绝插入或修改
- 检查主码的各个属性是否为空,只要有一个为空就拒绝插入或修改
5.2 参照完整性
参照完整性在CREATE TABLE中用FOREIGN KEY短语定义哪些列为外码,用REFERENCES短语指明这些外码参照哪些表的主码。
- 违约检查
- 对被参照表和参照表进行增删改操作时都会进行检查
- 策略处理(采用非默认策略需要显示地加以说明)
- 拒绝(NO ACTION)执行:不允许该操作执行,该策略一般设置为默认策略
- 级联(CASCADE)操作:当删除或修改被参照表的一个元组导致与参照表(SC)的不一致时,删除或修改参照表中的所有导致不一致的元组
- 设置为空值:当删除或修改被参照表的一个元组时造成了不一致,则将参照表中所有造成不一致的元组的对应属性设置为空值。
5.3 用户自定义完整性
-
属性上的约束条件的定义
-
元组上的约束条件
-
违约处理:拒绝执行
5.3 触发器(Trigger)
- 作用
- 用户定义在关系表上的一类由事件驱动的特殊过程
- 用于数据库完整性检查
- 可以用来实现数据库的其他功能,包括数据库安全性,以及一些业务流程和控制流程
- 说明
- 只有创建表的用户才可以在表上创建触发器,并且一个表上只能创建一定数量的触发器
- 触发器名唯一
- 触发器只能定义在基本表上,不能定义在视图上
- AFTER / BEFORE 是触发的时机,AFTER表示在触发事件的操作执行之后激活触发器
- 触发器类型:FOR EACH ROW(行级触发器)和FOR EACH STATEMENT(语句触发器),假设表TEACHAR 有1000行,行级触发器将执行1000次,而语句触发器只执行1次
- 触发条件:触发器被激活时,只有当触发条件为真时触发动作体才执行;否则触发动作体不执行。如果省略WHEN触发条件,则触发动作体在触发器激活后立即执行。
- 触发动作体:在过程体中可以使用NEW和OLD来引用UPDATE/INSERT事件之后的新值和之前的旧值,如果是语句级触发器则不能使用NEW或OLD引用。
6 关系数据库理论
-
数据依赖:数据依赖是一个关系内部属性与属性之间的一种约束关系
- 函数依赖(Functional Dependency,FD)
- 多值依赖(Multivalued Dependency,MVD)
- 其他
-
不恰当的关系模式可能造成的问题
- 数据冗余太大
- 更新异常:一个副本发生改变,所有副本都需要修改,需要花很大代价来维护数据库的完整性
- 插入异常:在某些数据存在时,另外的信息才能存入数据库中
- 删除异常:删除某些信息时可能丢失其它信息
6.1 规范化
- 规范化理论是用来改造关系模式,通过分解关系模式来消除其中不合适的数据依赖,以解决数据冗余、插入异常、更新异常、删除异常这些问题。
- 一个低一级范式的关系模式,通过模式分解可以转换为若干个高一级范式的关系模式的集合,这种过程就叫规范化
6.1.1 范式
- 1NF:如果一关系模式r®的每个属性对应的域值都是不可分的(即原子的)
- 2NF:若关系模式R∈1NF,并且每一个非主属性都完全函数依赖于任何一个候选码,则R∈2NF。
- 目标:将只部分依赖于候选码(即依赖于候选码的部分属性)的非主属性移到其他表中。
- 消除了由于非主属性对候选码的部 分依赖所引起的冗余及各种异常,但并没有排除传递依赖
- 3NF:若R∈3NF,则每一个非主属性既不部分依赖于码也不传递依赖于码
- BCNF:修正的第三范式,有时也称为扩充的第三范式。
- 一个满足BCNF的关系模式有:
- 所有非主属性都完全函数依赖于每个候选码
- 所有的主属性都完全函数依赖于每个不包含它的候选码
- 没有任何属性完全函数依赖于非码的任何一组属性
- 一个满足BCNF的关系模式有:
BCNF范式排除了:
- 任何属性(包括主属性和非主属性)对候选码的部分依赖和传递依赖;
- 主属性之间的传递依赖。
https://blog.csdn.net/weixin_43433032/article/details/89293663?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.channel_param&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.channel_param
7 数据库设计
- 6个阶段
- 需求分析:准确了解和分析用户需求
- 概念结构设计:通过对用户需求进行综合、归纳与抽象,形成一个独立于具体DBMS的概念模型
- 逻辑结构设计:将概念结构转换为某个DBMS所支持的数据模型,并对其进行优化
- 物理结构设计:为逻辑数据模型选取一个最适合应用环境的物理结构(包括存储结构和存取方法)
- 数据库实施:根据逻辑设计和物理设计的结果建立数据库,编制与调试应用程序,组织数据入库并试运行
- 数据库运行和维护:在数据库投入正式使用后不断地对其进行评价、调整与修改
7.1 需求分析
- 数据项:数据项描述 = {数据项名,数据项含义说明,别名,数据类型,取值范围……}
- 数据结构:数据结构反映了数据之间的组合关系。数据结构描述 = {数据结构名,含义说明,组成:{数据项或数据结构}}
- 数据流:数据流是数据结构在系统内传输的路径。数据流描述 = {数据流名,数据流来源,数据流去向,平均流量,高峰期流量,组成:{数据结构}}
- 数据存储:数据存储是数据结构停留或保存的地方。数据存储描述 = {数据存储名,说明,编号,输入的数据流,输出的数据流,组成:{数据结构},数据量,存取频度,存取方式}
- 处理过程:处理过程的具体处理逻辑一般用判定表或判定树来描述。处理过程描述 = {处理过程名,说明,输入:{数据流},输出:{数据流},处理:{简要说明}}概念结构设计
- 结果:需求分析阶段完成数据字典(用于表示收集到的数据)和一组数据流程图(Data Flow Diagram,DFD)
7.2 概念结构设计
- 自顶向下:即首先定义全局概念结构的框架,然后逐步细化
- 自底向上:即首先定义各局部应用的概念结构,然后将它们集成起来,得到全局概念结构
- 逐步扩张:首先定义最重要的核心概念结构,然后向外扩充
- 混合策略:即将自顶向下和自底向上相结合,用自顶向下策略设计一个全局概念结构的框架,以它为骨架集成由自底向上策略中设计的各局部概念结构。
7.3 逻辑结构设计
- E-R图如何转换为关系模型
- 1:1联系->转换为一个独立的关系模式,也可以与任意一端对应的关系模式合并
- 1:n联系->一个独立的关系模式,也可以与n端对应的关系模式合并
- m:n联系->一个关系模式
7.4 数据模型的优化
- 水平分解:把关系的元组分为若干子集合,定义每个子集合为一个子关系
- 垂直分解:把关系的属性分解为若干个子集合,形成若干子关系模式
- 设计用户子模式:将复杂查询定义为视图
8 数据库的运行与维护
1.数据库的转储和恢复
2.数据库的安全性、完整性控制
3.数据库性能的监督、分析和改造
4.数据库的重组织和重构造
9 关系查询处理和查询优化
9.1 查询处理步骤
- 查询分析:对查询语句进行扫描、词法和语法分析,判断是否符合SQL语法规则。
- 查询检查:根据数据字典对合法的查询语句进行语义检查
- 查询优化:从多种可供选择的执行策略中选择一个高效执行的查询处理策略
- 查询执行:代码生成器生成执行这个查询计划的代码
9.2 实现查询操作的算法
-
选择操作的实现
- 简单的全表扫描方法
- 索引(或散列)扫描方法
-
连接操作的实现
- 嵌套循环方法(nested loop)
- 排序-合并方法(sort-merge join 或 merge join)
- 索引连接方法(index join)
- Hash Join方法
9.3 查询优化策略(程序自动提供)
- 优化器可以从数据字典中获取许多统计信息,而用户程序则难以获得这些信息
- 如果数据库的物理统计信息改变了,系统可以自动对查询重新优化以选择相适应的执行计划
- 优化器可以考虑数百种不同的执行计划,程序员一般只能考虑有限的几种可能性
- 优化器中包括了很多复杂的优化技术,这些优化技术往往只有最好的程序员才能掌握。系统的自动 优化相当于使得所有人都拥有这些优化技术
9.4 代数优化
基于关系代数等价变换规则的优化方法,称为代数优化
- 典型的启发式规则
- 选择运算应尽可能先做
- 把投影运算和选择运算同时进行
- 把投影同其前或其后的双目运算结合起来,没有必要为了去掉某些字段而扫描一遍关系
- 把某些选择同在它前面要执行的笛卡尔积结合起来成为一个连接运算
- 找出公共子表达式
9.5 物理优化
物理优化就是要选择高效合理的操作算法或存取路径,求得优化的查询计划,达到查询优化的目标。
- 基于规则的启发式优化
- 基于代价估算的优化
- 两者结合的优化方法
基于启发式规则的存取路径选择优化
一、选择操作的启发式规则
1.对于小关系,使用全表顺序扫描,即使选择列上有索引
2.对于选择条件是主码 = 值 的查询,查询结果最多是一个元组,可以选择主码索引
3.对于选择条件是非主属性 = 值的查询,并且选择列上有索引,则要估算查询结果的元组数目,如果比例较小(< 10%)可以使用索引扫描,否则还是使用全表顺序扫描
4.对于选择条件是属性上的非等值查询或范围查询,并且选择列上有索引,同样要估算查询结果的元组数目。
5.对于用AND连接的合取选择条件,如果有涉及这些属性的组合索引,则优先采用组合索引扫描方法;如果某些属性上有一般的索引?否则使用全表顺序扫描
6.对于用OR连接的析取选择条件,一般使用全表顺序扫描
二、连接操作的启发式规则
1.如果2个表都已经按照连接属性排序,则选用排序-合并方法
2.如果一个表在连接属性上有索引,则可以选用索引连接方法
3.如果上面2个规则都不适用,其中一个表较小,可以选用Hash Join
4.最后可选用循环嵌套,选择其中较小的表作为外表
10 数据库恢复技术
- 事务是用户定义的一个数据库操作序列,这些操作要么全做要么全不做,是一个不可分割的工作单位
- 原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持续性(Durability),简称ACID
事务的ACID特性可能遭到破坏的因素有:
- (1) 多个事务并行运行时,不同事务的操作交叉执行
- (2) 事务在运行过程中被强制停止
10.1 故障的种类
1.事务内部的故障:
2.系统故障:如操作系统故障,CPU故障,系统断电
3.介质故障:如磁盘损坏、磁头碰撞、瞬时强磁场干扰等
4.计算机病毒
10.2 恢复的实现技术及策略
-
数据转储:即DBA定期地将整个数据库复制到磁带或另一个磁盘上保存起来的过程
- 静态转储和动态转储
- 海量转储和增量转储
-
登记日志文件
- 以记录为单位的日志文件
- 各个事务的开始(BEGIN TRANSACTION)标记
- 各个事务的结束(COMMIT或ROLLBACK)标记
- 各个事务的所有更新操作
- 以数据块为单位的日志文件
- 保存事务标识和被更新的数据块
- 作用:日志文件用于事务故障恢复和系统故障恢复,并协助后备副本进行介质故障恢复
- 事务故障恢复和系统故障恢复必须用日志文件
- 在动态转储方式中必须建立日志文件
- 静态转储方式中,也可以建立日志文件
- 登记日志文件时必须遵循两条规则:
- 登记的次序严格按并发事务执行的时间次序
- 必须先写日志文件,后写数据库
- 以记录为单位的日志文件
-
恢复策略
- REDO
- UDNO
- COMMIT
- ROLLBACK
-
事务故障的恢复
-
系统故障的恢复
-
介质故障的恢复
11 并发控制概述
事务是并发控制的基本单位,并发控制用于保证事务的隔离性和一致性。
不对并发操作进行正确调度,可能导致数据的不一致性问题,主要包括丢失修改、不可重复读和读“脏”数据。
11.1 封锁
- 排它锁(写锁,X锁):自身能读写,其他主体不能读写
- 共享锁(读锁,S锁):自身能读不能写,其他主体能读不能写,可以加S锁,不能加X锁
11.2 活锁和死锁
活锁即一个事务可能永远等待(系统总是先批准其他事务的锁请求),可以采用先来先服务的策略解决。
死锁即两个事务互相申请对方锁住的资源导致两个事务永远不能结束。
预防策略
-
一次性封锁法:一次性封锁发要求每个事务必须一次将所有要使用的数据全部加锁
-
顺序封锁法:预先对数据对象规定一个封锁顺序,所有事务都按这个顺序实行封锁。
-
死锁解除策略
- 如果一个事务的等待时间超过了规定的时限,就认为发生了死锁
- 并发控制子系统周期性地生成事务等待图,并进行检测,如果发现图中存在回路,则发生了死锁
-
并发调度的可串行性:多个事务的并发执行是正确的,当且仅当其结果与按某一次序串行地执行这些事务时的结果相同,称这种调度策略为可串行化的调度。
- 交换两个事务不冲突操作的次序得到 另一个调度Sc’ ,如果Sc’是串行的,称调度Sc 为冲突可串行化的调度
- 一个调度时冲突可串行化的,那么它一定是可串行化的调度,因此,可以用这种方法来判断一个调度是否是冲突可串行化的
- 冲突可串行化调度是可串行化调度的充分条件,不是必要条件,还有不满足冲突可串行化条件的可串行化调度
-
两段锁协议
- 两段锁协议是最常用的一种封锁协议,使用两段锁协议产生的是可串行化调度(充分条件)
- 两段锁协议是指所有事务必须分两个阶段对数据项加锁和解锁
- 在对任何数据进行读、写操作之前,首先要申请并获取对该数据的封锁
- 在释放一个封锁之后,事务不得再申请和获得任何其他封锁