第一章:
1、四大概念:
(1)数据:描述事物的可识别的符号称为数据。数据与其语义不可分离。
(2)数据库DB:长期存储在计算机内、有组织的、可共享的大量数据的集合。数据库中的数据按一定的数据模型组织、描述和储存,具有较小的冗余、较大数据独立性和易拓展性,可为各种用户共享。
(3)数据库管理系统DBMS:如mysql、oracle等,是计算机的基础软件。数据定义DDL、数据组织存储和管理、数据操纵DML为最基本的功能。事务管理和运行管理、数据库的建立和维护功能。
DQL:select from where
DML:insert、delete、update
DDL:create、drop、alter
DCL:grant、revoke
(4)数据库系统DBS:由数据库、操作系统、数据库管理系统、应用开发工具、应用系统、数据库管理员DBA、用户组成的存储、管理、处理和维护数据的系统。
2、数据库的发展
人工管理——》文件系统阶段——》数据库系统阶段
3、数据库系统的优点
数据结构化(是与文件系统最本质的区别)。
数据的共享性高、冗余度低且易扩充。
数据独立性高:物理独立性与逻辑独立性。
数据交由数据库管理系统统一管理和控制。
安全性:防止不合法使用造成的数据泄密和破坏。
完整性:正确性、有效性和相容性。
并发控制:X锁S锁
数据库恢复:REDO、UNDO
4、概念模型的基本概念:(按用户的观点对数据和信息建模)
概念模型是现实世界到机器世界的一个中间层次。概念模型用于信息世界的建模,是数据库设计人员进行数据库设计的有力工具。是数据库设计人员和用户之间进行交流的语言,双方都能看得懂。
通常使用的E-R模型(实体—联系方法)就是一种概念模型。里面含有:
(1)实体:客观存在并可以相互区分的事务(这个男人、那个男人)。
(2)实体型:用实体名(男人)及其属性名集合(身高、体重、年龄…)来抽象和刻画同类实体。
(3)实体集:同类型实体的集合(那一群男人)。
(4)实体之间的关系:包括实体(型)内部的联系和实体(型)之间的联系。一对一,一对多,多对多
5、数据模型的相关概念:(按计算机系统的观点对数据建模)由下面三部分组成
数据结构(存了什么):描述组成对象和对象之间的关系。(也就是实体和实体之间的关系)
数据操作(可以怎么操作):对数据库中的对象的值进行的操作
完整性约束(实体、参照、自定义):保证数据的正确、有效和相容
6、常见数据模型
(1)网状模型:允许一个以上的结点无双亲。一个基点可以有多于一个的双亲
(2)层次模型:只有根结点可以没有双亲结点。其他结点只能有一个双亲结点
7、数据库系统三级模式和两级映像的体系结构以及逻辑独立性和物理独立性
(1)三级模式
外模式:模式的子集。是局部数据的逻辑结构和特征的描述,是数据库用户的数据视图。
模式:数据库中全体数据的逻辑结构和特性的描述,是所有用户的公共试图。
内模式:对数据的物理结构和存储方式描述。
(2)两级映像
外模式/模式映像:外模式与模式的对应关系
模式/内模式映像:模式与内模式的对应关系
(3)两个独立性
逻辑独立性:依靠外模式/模式映像。如模式中加了一个关系,但是根据对应关系,外模式不用这个表,那么外模式不用改变。
物理独立性:依靠模式/内模式映像。如物理存储结构发生改变,模式不用变。
第二章
1、关系数据库(关系数据结构、关系操作集合、关系完整性约束)
(1)关系数据结构
①基本概念
域:(属性的取值范围) 一组具有相同数据类型的值的集合
笛卡尔积:一种集合运算
元组:(一行)关系中的每个元素
属性:(表中一列)表中一列对应一个域,域会相同(都是int,都是1-100,但是一个是数学成绩,一个是语文成绩),所以要取个名字,这个名字就是属性。
分量: 元组中的一个属性值
②码
超码:一组属性集,可以唯一标识元组
候选码:是超码去掉冗余属性,及候选码的任意子集都不能唯一标识元组
主码:有很多个候选码,就选一个为主键
外码:在意表中存放的其他表的朱健。如学生表中的课程号,在课程表中课程号为主键。
③关系
关系模式是型:对关系的描述。关系模式是静态的。比如学生和老师的关系。
关系是值,是关系模式的实例:(通常一个关系就是一张表)给定域的笛卡尔积的子集。关系是变化的,即属性的变化或者元组的变化。
关系数据库:关系的集合
关系的三种类型:基本关系(基本表)、查询表和视图
(2)关系操作集合
关系操作的对象和结果都是集合。
(3)关系完整性约束
2、关系代数
并、差、交、笛卡尔积
选择:选择元组
投影:投影列
连接:等值连接。自然连接是特殊的等值连接,会去掉重复列。(左/右)外连接
除:(x,y)除(y,z) x在左关系的象集,包含右关系y的投影。
第三章:
1、SQL语言的特点
综合统一、高度非过程化、面向集合的操作、以同一种语言提供多种使用方式、简单易懂易学。
2、SQL语言分类
数据查询语言DQL、数据操纵语言DML、数据定义语言DDL、数据控制语言DCL。
(1)数据查询语言DQL
数据查询语言DQL基本结构是由SELECT子句,FROM子句,WHERE子句组成的查询块:SELECT FROM WHERE
(2)数据操纵语言DML
数据操纵语言DML主要有三种形式:
插入:INSERT 更新:UPDATE 删除:DELETE
(3)数据定义语言DDL
①创建数据库中的各种对象-----表、视图、索引、同义词、聚簇等如: CREATE TABLE/VIEW/INDEX/SYN/CLUSTER表 视图 索引 同义词 簇
②drop、truncate、alter
DDL操作是隐性提交的!不能rollback
(4)数据控制语言DCL
数据控制语言DCL用来授予或回收访问数据库的某种特权,并控制数据库操纵事务发生的时间及效果,对数据库实行监视等。如:
GRANT:授权。
ROLLBACK [WORK] TO [SAVEPOINT]
COMMIT [WORK]:提交。
在数据库的插入、删除和修改操作时,只有当事务在提交到数据库时才算完成。在事务提交前,只有操作数据库的这个人才能有权看到所做的事情,别人只有在最后提交完成后才可以看到。
提交数据有三种类型:显式提交、隐式提交及自动提交。下面分别说明这三种类型。
(1) 显式提交
用COMMIT命令直接完成的提交为显式提交。其格式为:SQL>COMMIT;
(2) 隐式提交:用SQL命令间接完成的提交为隐式提交。这些命令是:ALTER,AUDIT,COMMENT,CONNECT,CREATE,DISCONNECT,DROP,EXIT,GRANT,NOAUDIT,QUIT,REVOKE,RENAME。
(3) 自动提交:若把AUTOCOMMIT设置为ON。 SQL>SET AUTOCOMMIT ON;
3、SQL操作
(1)模式
create schema
drop schema
(2)基本表
create table (
Sno varchar(10) primary key
unique、not null、foreign key(xxx) references table1(column1)
);
(3)数据查询
连接查询
外连接 left outer join SC on (student.sno=sc.sno)/using(sno) 后者自动去除重复行。外连接可以表示一个学生还没有选课时的学生选课表。
exists子查询。夫查询取元组,然后到子查询中查,子查询非空,则where返回true。
查询总结
数据更新
视图:
是一种虚拟的表,只存储定义,其实平时根本没有这个表,要使用是运行语句,具有和物理表相同的功能。可以对视图进行增,改,查,操作,试图通常是有一个表或者多个表的行或列的子集。对视图的修改会影响基本表。它使得我们获取数据更容易,相比多表查询。
优点:1对数据库的访问,因为视图可以有选择性的选取数据库里的一部分。
2)用户通过简单的查询可以从复杂查询中得到结果。
3)维护数据的独立性,视图可从多个表检索数据。
4)对于相同的数据可产生不同的视图。
5)使数据安全,不同权限的人,可以给不同的视图,即他们只能看到他们能看到的东西
缺点:性能:查询视图时,必须把视图的查询转化成对基本表的查询,如果这个视图是由一个复杂的多表查询所定义,那么,那么就无法更改数据
第四章:
1、数据库的安全性
保护数据库以防止不合法的使用所造成的数据泄露、更改或破坏。
2、数据库的不安因素
非授权用户对数据库的恶意存取和破坏、数据库中重要或敏感的数据被泄露,安全环境的脆弱性。
3、TCSEC标准和CC标准
4、数据库安全性控制方法
(1)用户身份鉴别:
①静态口令:密码
②动态口令:短信验证码
③生物特征鉴别:扫脸、指纹
④智能卡鉴别:校园卡进门
(2)多层存取控制:主要包括 定义用户权限 和 合法权限检测,其组成了存取控制子系统。
(3)审计
(4)视图
(5)数据加密
5、存取控制
(1)自主存取控制DAC:不同用户对不同对象的权限不同,对同一对象的权限也不同。用户也可以把自己的权限赋予他人。
①GRANT select,insert,update(column),ALL PRIVILEGES ON TABLE table_name/public TO user_name WITH GRANT OPTION;指定了这个,那么被授予权限的用户可以继续把权限赋予别人,但是不允许循环赋予。
②REVOKE select ON TABLE table_name FROM user_name/public CASCADE;级联,那么不仅收回他的权限,他所赋予的用户的权限也会收回。
③角色:权限的集合
CREATE ROLE role_name;
GRANT 权限 ON 对象 对象名 TO role_name WITH ADMIN OPTION;
GRANT role_name TO role_name2
REVOKE 权限 ON 对象 对象名 FROM role_name;
(2)强制存取控制。
①仅当主体的许可证级别大于或等于客体的密级时,该主体才能读取相应客体。
②仅当主体的许可证级别小于或等于客体的密级时,该主体才能写相应的客体。
6、审计
把用户的操作记录到审计日志中。
AUDIT alter,update ON SC 开启审计功能
NOAUDIT alter,update ON SC 关闭审计功能
7、数据加密:将明文转为密文
存储加密:透明(对用户透明),非透明(加函数)
传输加密
第五章:数据库完整性
1、数据库的完整性是指数据的正确性和相容性
2、数据库管理系统在安全性方面的功能
(1)提供定义完整性约束条件的机制
(2)提供完整性检查的方法
(3)进行违约处理
3、实体完整性约束
主属性不能为空、主码值必须唯一
4、参照完整性约束
5、用户自定义完整性
(1)属性上的约束条件
不允许空值、列值唯一、check短语指定列值应该满足的条件、
(2)元组上的约束条件
check(。。。。)独立一行,而不是跟在列定义后面
(3)create table(sno number(8) CONSTRAINT C1 CHECK (xxxxx))
在create table中定义约束,并起名称,方便修改和删除。
6、断言:create assertion ass_name check(xxxx);
与触发器的不同在于,它只能进行检查并拒绝执行和允许执行。不能修改数据等。
7、触发器
触发器是一种特殊的存储过程,主要是通过事件来触发而被执行的。
它可以强化约束,来维护数据的完整性和一致性,可以跟踪数据库内的操作从而不允许未经许可的更新和变化。
可以联级运算。如,某表上的触发器上包含对另一个表的数据操作,而该操作又会导致该表触发器被触发。
包括触发时机:before和after
触发器类型:语句级for each statement、行级for each row
触发条件
触发动作体
第六章、关系数据理论
1、关系模式存在的问题
数据冗余、更新异常、插入异常、删除异常。
为了解决
2、函数依赖
平凡的函数依赖:x->y 但y属于x
非平凡函数依赖:我们研究的一般默认是非平凡函数依赖
完全函数依赖:x->y , 且y不函数依赖于x的任意子集
部分函数依赖
3、超码 U->K
候选码U完全函数依赖K
4、范式
范式可以说是一种体系,也是一种评判标准。数据库中的数据满足不同程度要求的为不同范式。
一个低一级范式的关系模式通过模式分解可以转换为若干个高一级范式的关系模式的集合,这个过程就是规范化。
5、数据库范式,根据某个场景设计数据表?
①第一范式:(确保每列保持原子性)所有字段值都是不可分解的原子值。
第一范式是最基本的范式。如果数据库表中的所有字段值都是不可分解的原子值,就说明该数据库表满足了第一范式。
用户信息遵循了第一范式的要求,这样在对用户使用城市进行分类的时候就非常方便,也提高了数据库的性能。
②第二范式:(确保表中的每列都和主键相关)在一个数据库表中,一个表中只能保存一种数据,不可以把多种数据保存在同一张数据库表中。消除非主属性对码的部份依赖
第二范式在第一范式的基础之上更进一层。第二范式需要确保数据库表中的每一列都和主键相关,而不能只与主键的某一部分相关(主要针对联合主键而言)。也就是说在一个数据库表中,一个表中只能保存一种数据,不可以把多种数据保存在同一张数据库表中。
比如要设计一个订单信息表,因为订单中可能会有多种商品,所以要将订单编号和商品编号作为数据库表的联合主键。
③第三范式:(确保每列都和主键列直接相关,而不是间接相关) 数据表中的每一列数据都和主键直接相关,而不能间接相关。消除非主属性对码的传递依赖
第三范式需要确保数据表中的每一列数据都和主键直接相关,而不能间接相关。
比如在设计一个订单数据表的时候,可以将客户编号作为一个外键和订单表建立相应的关系。而不可以在订单表中添加关于客户其它信息(比如姓名、所属公司等)的字段。
④BCNF:符合3NF,并且,主属性不依赖于主属性。消除主属性对码的部份依赖和传递依赖
若关系模式属于第二范式,且每个属性都不传递依赖于键码,则R属于BC范式。
通常BC范式的条件有多种等价的表述:每个非平凡依赖的左边必须包含键码;每个决定因素必须包含键码。
BC范式既检查非主属性,又检查主属性。当只检查非主属性时,就成了第三范式。满足BC范式的关系都必然满足第三范式。
还可以这么说:若一个关系达到了第三范式,并且它只有一个候选码,或者它的每个候选码都是单属性,则该关系自然达到BC范式。
一般,一个数据库设计符合3NF或BCNF就可以了。
⑤第四范式:要求把同一表内的多对多关系删除。
⑥第五范式:从最终结构重新建立原始结构。
6、数据依赖的公理系统
第七章、数据库设计
1、数据库设计的步骤
需求分析、概念结构设计、逻辑结构设计、物理结构设计、数据库实施、数据库运行和维护。
2、需求分析:
通过调查、收集与分析,获得用户对数据库的 信息要求、处理要求、安全性与完整性要求。
3、数据字典
关于数据库中数据的描述,即元数据,而不是数据本身。
数据字典在需求分析阶段建立,在数据库设计过程中不断修改、充实、完善。
4、概念结构设计
(1)概念模型的特点:真实充分反映现实,易于理解,易于更改,易于向关系网状层次等各种数据模型转换。
(2)E-R模型:实体(属性)+联系(属性、几对几)
实体与属性划分原则:
① 现实世界中作为属性的尽量作为属性
② 属性不能再有可以描述的性质
③ 属性不能再和其他实体有联系
(3)E-R图集成
属性冲突:属性值的类型、气质范围或取值集合不同。如身高有的cm、有的m
命名冲突:同名异义,异名同义。
结构冲突:
同一对象在不同应用中具有不同的抽象
同一实体在不同子系统中E-R所包含的属性以及排序不同
实体间的联系在不同E-R图中为不同的类型
5、逻辑设计结构
E-R图向关系模式的转换
6、存取方法
10、什么是索引?
数据库索引,是数据库管理系统中一个排序的数据结构,索引的实现通常使用B树及其变种B+树。
在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构上实现高级查找算法。这种数据结构,就是索引。
11.索引的作用?它的优点缺点是什么?
①索引作用:协助快速查询、更新数据库表中数据。
②为表设置索引要付出代价的:
一是增加了数据库的存储空间
二是在插入和修改数据时要花费较多的时间(因为索引也要随之变动)。
12.索引的优缺点?
创建索引可以大大提高系统的性能(优点):
1.通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。
2.可以大大加快数据的检索速度,这也是创建索引的最主要的原因。
3.可以加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义。
4.在使用分组和排序子句进行数据检索时,同样可以显著减少查询中分组和排序的时间。
5.通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能。
增加索引也有许多不利的方面(缺点):
1.创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加。
2.索引需要占物理空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间,如果要建立聚簇索引,那么需要的空间就会更大。
3.当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,这样就降低了数据的维护速度。
4.哪些列适合建立索引、哪些不适合建索引?
索引是建立在数据库表中的某些列的上面。在创建索引的时候,应该考虑在哪些列上可以创建索引,在哪些列上不能创建索引。
一般来说,应该在这些列上创建索引:
(1)在经常需要搜索的列上,可以加快搜索的速度;
(2)在作为主键的列上,强制该列的唯一性和组织表中数据的排列结构;
(3)在经常用在连接的列上,这些列主要是一些外键,可以加快连接的速度;
(4)在经常需要根据范围进行搜索的列上创建索引,因为索引已经排序,其指定的范围是连续的;
(5)在经常需要排序的列上创建索引,因为索引已经排序,这样查询可以利用索引的排序,加快排序查询时间;
(6)在经常使用在WHERE子句中的列上面创建索引,加快条件的判断速度。
对于有些列不应该创建索引:
(1)对于那些在查询中很少使用或者参考的列不应该创建索引。
这是因为,既然这些列很少使用到,因此有索引或者无索引,并不能提高查询速度。相反,由于增加了索引,反而降低了系统的维护速度和增大了空间需求。
(2)对于那些只有很少数据值的列也不应该增加索引。
这是因为,由于这些列的取值很少,例如人事表的性别列,在查询的结果中,结果集的数据行占了表中数据行的很大比例,即需要在表中搜索的数据行的比例很大。增加索引,并不能明显加快检索速度。
(3)对于那些定义为text, image和bit数据类型的列不应该增加索引。
这是因为,这些列的数据量要么相当大,要么取值很少。
(4)当修改性能远远大于检索性能时,不应该创建索引。
这是因为,修改性能和检索性能是互相矛盾的。当增加索引时,会提高检索性能,但是会降低修改性能。当减少索引时,会提高修改性能,降低检索性能。因此,当修改性能远远大于检索性能时,不应该创建索引。
5.什么样的字段适合建索引
唯一、不为空、经常被查询的字段
7.B树和B+树的区别
B树,每个节点都存储key和data,所有节点组成这棵树,并且叶子节点指针为nul,叶子结点不包含任何关键字信息。
B+树,所有的叶子结点中包含了全部关键字的信息,及指向含有这些关键字记录的指针,且叶子结点本身依关键字的大小自小而大的顺序链接,所有的非终端结点可以看成是索引部分,结点中仅含有其子树根结点中最大(或最小)关键字。 (而B 树的非终节点也包含需要查找的有效信息)
8.为什么说B+比B树更适合实际应用中操作系统的文件索引和数据库索引?
1.B+的磁盘读写代价更低
B+的内部结点并没有指向关键字具体信息的指针。因此其内部结点相对B树更小。如果把所有同一内部结点的关键字存放在同一盘块中,那么盘块所能容纳的关键字数量也越多。一次性读入内存中的需要查找的关键字也就越多。相对来说IO读写次数也就降低了。
2.B+tree的查询效率更加稳定
由于非终结点并不是最终指向文件内容的结点,而只是叶子结点中关键字的索引。所以任何关键字的查找必须走一条从根结点到叶子结点的路。所有关键字查询的路径长度相同,导致每一个数据的查询效率相当。
9.聚集索引和非聚集索引区别?
聚合索引(clustered index):
聚集索引表记录的排列顺序和索引的排列顺序一致,所以查询效率快,只要找到第一个索引值记录,其余就连续性的记录在物理也一样连续存放。聚集索引对应的缺点就是修改慢,因为为了保证表中记录的物理和索引顺序一致,在记录插入的时候,会对数据页重新排序。
聚集索引类似于新华字典中用拼音去查找汉字,拼音检索表于书记顺序都是按照a~z排列的,就像相同的逻辑顺序于物理顺序一样,当你需要查找a,ai两个读音的字,或是想一次寻找多个傻(sha)的同音字时,也许向后翻几页,或紧接着下一行就得到结果了。
非聚合索引(nonclustered index):
非聚集索引指定了表中记录的逻辑顺序,但是记录的物理和索引不一定一致,两种索引都采用B+树结构,非聚集索引的叶子层并不和实际数据页相重叠,而采用叶子层包含一个指向表中的记录在数据页中的指针方式。非聚集索引层次多,不会造成数据重排。
非聚集索引类似在新华字典上通过偏旁部首来查询汉字,检索表也许是按照横、竖、撇来排列的,但是由于正文中是a~z的拼音顺序,所以就类似于逻辑地址于物理地址的不对应。同时适用的情况就在于分组,大数目的不同值,频繁更新的列中,这些情况即不适合聚集索引。
根本区别:
聚集索引和非聚集索引的根本区别是表记录的排列顺序和与索引的排列顺序是否一致。
第八章 嵌入式SQL
1、游标是什么?
是对查询出来的结果集作为一个单元来有效的处理。游标可以定在该单元中的特定行,从结果集的当前行检索一行或多行。可以对结果集当前行做修改。一般不使用游标,但是需要逐条处理数据的时候,游标显得十分重要。
2、什么是存储过程?用什么来调用?
存储过程是一个预编译的SQL语句,优点是允许模块化的设计,就是说只需创建一次,以后在该程序中就可以调用多次。如果某次操作需要执行多次SQL,使用存储过程比单纯SQL语句执行要快。
调用:
(1)可以用一个命令对象来调用存储过程。
(2)可以供外部程序调用,比如:java程序。
3.存储过程的优缺点?
优点:
1)存储过程是预编译过的,执行效率高。
2)存储过程的代码直接存放于数据库中,通过存储过程名直接调用,减少网络通讯。
3)安全性高,执行存储过程需要有一定权限的用户。
4)存储过程可以重复使用,可减少数据库开发人员的工作量。
缺点:移植性差
4.存储过程与函数的区别
存储过程是procedure,函数是function。
存储过程可以作为独立的pl-sql使用,函数不能独立使用,必须作为表达式的一部分。
函数必须有返回值。存储过程不能用return
函数除了execute和begin,end启动之外,还可以当作表达式使用,如select f1() from dual;
第九章 关系查询处理和查询优化
1.查询语句不同元素(where、jion、limit、group by、having等等)执行先后顺序?
• 1.查询中用到的关键词主要包含六个,并且他们的顺序依次为 select–from–where–group by–having–order by
其中select和from是必须的,其他关键词是可选的,这六个关键词的执行顺序 与sql语句的书写顺序并不是一样的,而是按照下面的顺序来执行
from:需要从哪个数据表检索数据
where:过滤表中数据的条件
group by:如何将上面过滤出的数据分组
having:对上面已经分组的数据进行过滤的条件
select:查看结果集中的哪个列,或列的计算结果
order by :按照什么样的顺序来查看返回的数据
• 2.from后面的表关联,是自右向左解析 而where条件的解析顺序是自左向右的。
也就是说,在写SQL语句的时候,尽量把数据量小的表放在最右边来进行关联(用小表去匹配大表),而把能筛选出小量数据的条件放在where语句的最左边 (用小表去匹配大表)
2、查询树的启发
(1)选择运算尽可能先做。
(2)投影和选择同时进行
(3)把投影同其前或后的双目运算结合起来
(4)把某些选择同它前面要执行的笛卡尔积结合起来成为一个连接运算
(5)找出公共子表达式
第十章、数据恢复技术
1、故障类型
事物内部故障:大部分是非预期的——》UNDO(事务撤销)
系统故障:未完成的事务UNDO,已经完成的事务REDO(重做)。
介质故障
计算机病毒
回复策略就是冗余。
2、数据回复策略
数据转存、登记日志文件(先写日志,再写数据库)、
3、什么是事务?
事务是用户定义的一个数据库操作序列,这些操作要么全做,要么全不做,是一个不可分割的工作单位。主要用来保证数据的完整性和一致性。
4、事务四大特性(ACID)原子性、一致性、隔离性、持久性?
原子性(Atomicity):
原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚,因此事务的操作如果成功就必须要完全应用到数据库,如果操作失败则不能对数据库有任何影响。
一致性(Consistency):
事务开始前和结束后,数据库的完整性约束没有被破坏。比如A向B转账,不可能A扣了钱,B却没收到。
隔离性(Isolation):
隔离性是当多个用户并发访问数据库时,比如操作同一张表时,数据库为每一个用户开启的事务,不能被其他事务的操作所干扰,多个并发事务之间要相互隔离。同一时间,只允许一个事务请求同一数据,不同的事务之间彼此没有任何干扰。比如A正在从一张银行卡中取钱,在A取钱的过程结束前,B不能向这张卡转账。
持久性(Durability):
持久性是指一个事务一旦被提交了,那么对数据库中的数据的改变就是永久性的,即便是在数据库系统遇到故障的情况下也不会丢失提交事务的操作。
5、事务的并发?
从理论上来说, 事务应该彼此完全隔离, 以避免并发事务所导致的问题,然而, 那样会对性能产生极大的影响, 因为事务必须按顺序运行,在实际开发中,为了提升性能, 事务会以较低的隔离级别运行,事务的隔离级别可以通过隔离事务属性指定。
6、事务的并发问题
(1)丢失修改:我把100改为200,修改后读取前别人改回了100.我的修改就丢失了。
(2)不可重复读:我拿了分数,然后忘记了,再拿一次,结果在这之间有人修改了,我拿的数据就跟之前不一样了。
(3)读“脏数据”:他改金额200为100,我正好要用这个数据,我读取后,他撤回了,也就是我我拿到的数据就没用了,就“脏”了。
7、并发控制机制
(1)封锁:X锁/排他锁/写锁 S锁/共享锁/读锁
一级封锁协议:修改前加X锁,直到事务结束。
二级封锁协议:修改前加X锁,直到事务结束。并且读取前加S锁,读完放掉。
三级封锁协议:修改前加X锁,直到事务结束。读取前加S锁,直到事务结束。
(2)活锁:你一直在等着买东西,但是老是有vip插队,你一直在等待。
解决办法:就是先来先服务。
(3)死锁:我锁定了数据1,他锁定了数据2,我要申请锁定数据2,然后操作完释放资源。他要申请锁定数据1,然后操作完释放资源。那么我和他永远无法获得。
解决办法:一次封锁,你要什么一次性说清楚,都锁了。不要到时候被别人拿了
顺序封锁,规定一个封锁的顺序
诊断:超时法、等待图法(出现回路就表示有死锁)
(4)并发调度
可串行化调度:多个事务的并发执行是正确的,当且仅当其结果与按某一次序串行执行的结果相同。这种调度是可串行化调度。
(5)悲观锁,乐观锁
悲观锁:干一个锁一个
乐观锁:提交事务更新前检查再该事务读取数据后,有没有其他事务了数据。数据库的做法是加一个版本号。
我修改了数据的版本号从1,变为2,那么别人昨晚操作要提交前,先判断版本号是不是1,不是就拒绝。
时间戳
乐观控制法
多版本控制
8、嵌套事务
什么是嵌套事务?
嵌套是子事务套在父事务中执行,子事务是父事务的一部分,在进入子事务之前,父事务建立一个回滚点,叫save point,然后执行子事务,这个子事务的执行也算是父事务的一部分,然后子事务执行结束,父事务继续执行。重点就在于那个save point。看几个问题就明了了:
如果子事务回滚,会发生什么?
父事务会回滚到进入子事务前建立的save point,然后尝试其他的事务或者其他的业务逻辑,父事务之前的操作不会受到影响,更不会自动回滚。
如果父事务回滚,会发生什么?
父事务回滚,子事务也会跟着回滚!为什么呢,因为父事务结束之前,子事务是不会提交的,我们说子事务是父事务的一部分,正是这个道理。那么:
事务的提交,是什么情况?
是父事务先提交,然后子事务提交,还是子事务先提交,父事务再提交?答案是第二种情况,还是那句话,子事务是父事务的一部分,由父事务统一提交。