数据库系统概念》18-事务

图片 1

《数据库系统概念》18-事务

事务是一个程序执行单元,它访问且可能更新不同的数据项。事务对于实现数据库中的数据更新是很关键的,只有这样才能保证并发执行与各种故障不会导致数据库处于不一致状态。

事务是一个程序执行单元,它访问且可能更新不同的数据项。事务对于实现数据库中的数据更新是很关键的,只有这样才能保证并发执行与各种故障不会导致数据库处于不一致状态。

事务是一个程序执行单元,它访问且可能更新不同的数据项。事务对于实现数据库中的数据更新是很关键的,只有这样才能保证并发执行与各种故障不会导致数据库处于不一致状态。

一、关系型数据库简介

一、事务具有ACID特性:即原子性、一致性、隔离性和持久性
原子性保证事务的所有影响在数据库中要么全部反映出来,要么根本不反映。发生故障后数据库不能处于事物部分执行后的状态。
一致性保证若数据库一开始是一致的,则事务执行后数据库仍处于一致状态。
隔离性保证并发执行的事务相互隔离,使得每个事务感觉不到系统中其它事务的并发执行。
持久性保证一旦一个事务提交后,它对数据库的改变不会丢失,即使系统可能出现故障。

一、事务具有ACID特性:即原子性、一致性、隔离性和持久性
原子性保证事务的所有影响在数据库中要么全部反映出来,要么根本不反映。发生故障后数据库不能处于事物部分执行后的状态。
一致性保证若数据库一开始是一致的,则事务执行后数据库仍处于一致状态。
隔离性保证并发执行的事务相互隔离,使得每个事务感觉不到系统中其它事务的并发执行。
持久性保证一旦一个事务提交后,它对数据库的改变不会丢失,即使系统可能出现故障。

一、事务具有ACID特性:即原子性、一致性、隔离性和持久性

a)DML

二、事务的并发执行提高了事务的吞吐量和系统利用率,也减少了事务的等待时间。
但多个事务在数据库中并发执行时,可能无法再保证数据的一致性。因此系统必须控制各并发事务之间的相互作用。
由于事务是保持一致性的单元,所以事务的串行执行能保证一致性。串行调度是可串行化的,但如果许多事务的步骤交错执行,则很难确定一个调度是否是可串行化的。确定一个事务有哪些操作、多个事务的操作如何相互作用是比较困难的。所以,通常不会考虑一个事务对某一数据项的的所有细节操作,而只考虑两种操作:read和write。
要求事务集的并发执行所产生的任何调度的执行效果等价于由这些事务按某种串行顺序执行的效果,保证这个特性的系统称为保证了可串行化。考虑一个调度S含有I,J两条指令,只有I和J全为read指令时,两条指令的执行顺序才是无关紧要的,而只要有至少一条是write指令时,I和J是冲突的。
如果调度S可以经过一系列非冲突指令交换转换成S1,则称S1是S的冲突等价。存在几种不同的等价概念,所以可串行化分为了冲突可串行化和视图可串行化。

二、事务的并发执行提高了事务的吞吐量和系统利用率,也减少了事务的等待时间。
但多个事务在数据库中并发执行时,可能无法再保证数据的一致性。因此系统必须控制各并发事务之间的相互作用。
由于事务是保持一致性的单元,所以事务的串行执行能保证一致性。串行调度是可串行化的,但如果许多事务的步骤交错执行,则很难确定一个调度是否是可串行化的。确定一个事务有哪些操作、多个事务的操作如何相互作用是比较困难的。所以,通常不会考虑一个事务对某一数据项的的所有细节操作,而只考虑两种操作:read和write。
要求事务集的并发执行所产生的任何调度的执行效果等价于由这些事务按某种串行顺序执行的效果,保证这个特性的系统称为保证了可串行化。考虑一个调度S含有I,J两条指令,只有I和J全为read指令时,两条指令的执行顺序才是无关紧要的,而只要有至少一条是write指令时,I和J是冲突的。
如果调度S可以经过一系列非冲突指令交换转换成S1,则称S1是S的冲突等价。存在几种不同的等价概念,所以可串行化分为了冲突可串行化和视图可串行化。

原子性保证事务的所有影响在数据库中要么全部反映出来,要么根本不反映。发生故障后数据库不能处于事物部分执行后的状态。

SQL语言是非过程的,一次查询中,可以输入多张表,但结果只是一张表。比如

三、事务并发执行所产生的调度的可串行化可以通过多种并发控制机制中的一种来加以保证。给定一个调度,可以通过为该调度构造优先图及搜索是否无环来判定它是否冲突可串行化。还有更好的并发控制机制可用来保证可串行化。
调度必须是可恢复的,这样如果事务a依赖于事务b,如果b中止时,a也要中止。调度也最好是无级联的,这样不会由于一个事务的中止引起其它事务的级联中止。无级联性是通过只允许事务读取已经提交的数据来保证的。

三、事务并发执行所产生的调度的可串行化可以通过多种并发控制机制中的一种来加以保证。给定一个调度,可以通过为该调度构造优先图及搜索是否无环来判定它是否冲突可串行化。还有更好的并发控制机制可用来保证可串行化。
调度必须是可恢复的,这样如果事务a依赖于事务b,如果b中止时,a也要中止。调度也最好是无级联的,这样不会由于一个事务的中止引起其它事务的级联中止。无级联性是通过只允许事务读取已经提交的数据来保证的。

一致性保证若数据库一开始是一致的,则事务执行后数据库仍处于一致状态。

select instructor.name

学习资料:Database System Concepts, by Abraham Silberschatz, Henry
F.Korth, S.Sudarshan

学习资料:Database System Concepts, by Abraham Silberschatz, Henry
F.Korth, S.Sudarshan

隔离性保证并发执行的事务相互隔离,使得每个事务感觉不到系统中其它事务的并发执行。

from instructor

 

持久性保证一旦一个事务提交后,它对数据库的改变不会丢失,即使系统可能出现故障。

where instructor.dept_name=’history’,

二、事务的并发执行提高了事务的吞吐量和系统利用率,也减少了事务的等待时间。

查询语句定义了要查找dept_name列为history的数据,并显示name列,执行后得到的是一张表,只有一个name列,每个符合dept_name=’history’筛选条件的数据作为一行。

但多个事务在数据库中并发执行时,可能无法再保证数据的一致性。因此系统必须控制各并发事务之间的相互作用。

b) DDL

由于事务是保持一致性的单元,所以事务的串行执行能保证一致性。串行调度是可串行化的,但如果许多事务的步骤交错执行,则很难确定一个调度是否是可串行化的。确定一个事务有哪些操作、多个事务的操作如何相互作用是比较困难的。所以,通常不会考虑一个事务对某一数据项的的所有细节操作,而只考虑两种操作:read和write。

DDL可以定义表、约束、断言等,比如有如下创建表的语句:

要求事务集的并发执行所产生的任何调度的执行效果等价于由这些事务按某种串行顺序执行的效果,保证这个特性的系统称为保证了可串行化。考虑一个调度S含有I,J两条指令,只有I和J全为read指令时,两条指令的执行顺序才是无关紧要的,而只要有至少一条是write指令时,I和J是冲突的。

create table department(

如果调度S可以经过一系列非冲突指令交换转换成S1,则称S1是S的冲突等价。存在几种不同的等价概念,所以可串行化分为了冲突可串行化和视图可串行化。

dept_name char,

三、事务并发执行所产生的调度的可串行化可以通过多种并发控制机制中的一种来加以保证。给定一个调度,可以通过为该调度构造优先图及搜索是否无环来判定它是否冲突可串行化。还有更好的并发控制机制可用来保证可串行化。

building char,

调度必须是可恢复的,这样如果事务a依赖于事务b,如果b中止时,a也要中止。调度也最好是无级联的,这样不会由于一个事务的中止引起其它事务的级联中止。无级联性是通过只允许事务读取已经提交的数据来保证的。

budget numeric;

学习资料:Database System Concepts, by Abraham Silberschatz, Henry
F.Korth, S.Sudarshan

创建了表department和它的列,并指定了各列的数据类型。DDL语句会同时更新数据字典。

c) 从应用程序访问数据库

SQL语句没有通用的图灵机那么强大,有很多计算是SQL无法做到的,比如接收用户输入、显示内容、网络通讯等,这些功能必须使用像c、c++等宿主语言来实现,然后在程序中嵌入SQL语言来访问数据库。

从应用程序访问数据库有两种方式:

提供应用程序接口来传递DML、DDL,然后取回结果。比如c语言的ODBC、java的JDBC等;

在应用程序中使用DML预编译器,然后通过扩展宿主语言的语法来嵌入DML调用。

二、数据库设计

需求分析阶段、概念设计阶段和实现阶段。

a)在概念设计阶段,要选择数据模型,将需求转化为schema,这个阶段的重点是对数据和数据关系进行描述。这个阶段要解决使用哪些字段和怎样组织这些字段的问题,前者是商业问题,后者才是计算机科学问题。

关于组织字段的的方式通常有两种,一种是使用E-R模型,一种是使用算法自动生成表。

这个阶段设计的schema需要满足对数据增删改查的要求,

b)
实现阶段,包括逻辑设计和物理设计两步,逻辑设计将高度抽象的概念模型转换为数据库实现,然后物理设计则解决文件的组织、存储结构等问题。

c) 不好的设计会造成信息的冗余以及缺乏表达某些信息的能力:

图片 2

比如这张表同时包含了教师(id,name,salary)和部门信息,history信息在两行中都有,修改history的budget时需要两行都修改;而如果我们想增加一个部门时,就会暴露出这个设计表达能力不足的问题,因为只有先增加一个教师才能增加部门。

三、数据存储和检索

对一个数据库系统来说,存储管理器和查询处理器是非常重要的两部分。

a) 存储管理器

数据存储在硬盘上,CPU的和内存的速度大于硬盘的读取速度,所以它需要尽可能地减少数据在硬盘与内存之间的转移,并负责将DML语句翻译成物理层的命令。即存储管理器负责数据的增删改查,它包含的模块或功能有:

权限及完整性管理器:负责检查完整性约束、控制用户访问权限;

事务管理器:用于保证系统在发生故障时的一致状态,以及保证并发事物无冲突地执行;

文件管理器:负责硬盘空间的分配并管理保存在硬盘上的数据结构;

缓存管理器:负责将数据从硬盘读取到内存,并决定将哪些数据缓存到内存。缓存管理器是数据库系统的重要部分,有了缓存管理器,数据库才能够处理比内存容积大得多的数据。

存储管理器所操作的文件类型有:

数据文件:数据库本身

数据字典:对schema的描述

索引:用于提高检索效率,索引维护了一系列指向特定数据的指针

b) 查询处理器

包含多个部分:

DDL翻译器:翻译DDL指令并记录到数据字典

DML编译器:将DML语句编译成查询评估引擎能理解的低级指令。DML语句往往可以有不同的翻译,这些翻译的执行结果相同但性能不一,DML编译器也负责查询优化,选择性能最高的翻译方式。

查询评估引擎:执行由DML编译器生成的低级指令

四、事务管理

a)
某些对数据的的操作常常会形成单一的逻辑工作单元,比如转账,从A账户扣款M元,然后给B账户增加M元,这两步操作必须要么都成功,要么都失败,这样的要求也称为原子性(atomicity);另外A、B账户的总和在操作事务前后保持不变,这称为一致性(consistency)。事务操作必须满足原子性和一致性,在操作过程中允许暂时地违背一致性(比如转账,A、B账户的增减需要过程)。

b) 一致性由开发人员来保证,而原子性由数据库自身来保证;

对于转账操作来说,开发人员需要合理地划分操作步骤,比如讲之分为从A账户转出和给B账户转入两步,如果将这两步划分为一个事务,则符合一致性,如果任何一步独立,则会违背一致性;

c) 数据库的恢复管理器负(recovery
manager)负责原子性,实际应用中,事务难免会失败,这时要屏蔽失败的事务对数据库的影响(回滚到失败前的状态failure
recovery)。

并发控制器(concurrency-control
manager),在遇到事务需要并发执行时,无法保存操作前的状态,这时由并发控制器通过控制事务间的交互来保证一致性。

恢复管理器和并发控制器组成了事务管理器。

五、数据库结构(database architecture)

数据库的结构多种多样,比如有集中式(centralize)、服务端-客户端式、并行式、分布式(distrubuted)等。

数据库的通用结构如图:

图片 3

六、数据库的普通用户和管理员

数据库的用户可以分为普通用户和管理员(administrator)

a)普通用户及对应的用户接口

依据用户期望的与数据库的交互方式可以进一步分为四类,对应有不同的用户接口

无经验的用户(naive
user):使用事先写好的程序与数据库交互,用户接口通常为表单;

开发者:负责编写数据库交互界面;

熟练的用户(sophisticate):比如数据分析员,使用专业的分析软件或直接写SQL来与数据库交互;

专门的用户(specialized
user),编写特殊的数据库应用的人员,比如计算机辅助设计系统、知识库、专家系统、存储复杂数据结构的系统等。

b)管理员

通常DBA可以做的操作包括:

定义schema

定义数据的存储结构和访问方式

修改schema和数据的物理组织方式

访问权限控制

日常维护,比如定期备份、确保硬盘空间充足、监控数据库高效运行等

学习资料:Database System Concepts, by Abraham Silberschatz, Henry
F.Korth, S.Sudarshan

发表评论

电子邮件地址不会被公开。 必填项已用*标注