Oracle从入门到项目实践

第3章 熟悉Oracle数据库体系结构

3.2逻辑存储结构

逻辑存储结构主要由数据块、数据区、数据段、表空间等组成。

1.表空间是数据库中最大的逻辑划分区域,通常用来存放数据表、索引、回滚段等数据对象,任何数据对象在创建时必须指定存储在某个表空间中。一个表空间由一个或多个数据文件组成,而一个数据文件只属于一个表空间。

2.数据段是一个独立的逻辑存储结构,用于存储表、索引或簇等占用空间的数据对象。

3.数据区也称为数据扩展区,是由一组连续的Oracle数据块所构成的Oracle存储结构,一个或多个数据块组成一个数据区,一个或多个数据区组成一个段。数据区是Oracle存储分配的最小单位,使用数据区的目的是保存特定数据类型的数据。

4.数据块是Oracle逻辑存储结构中最小的逻辑单位,也是执行数据库输入/输出操作的最小存储单位。

3.3物理存储结构

Oracle物理存储结构是由数据文件、联机重做日志文件、控制文件组成的,当然也包括一些其他的文件,如归档重做日志文件、参数文件、密码文件、告警文件、跟踪文件、备份文件等。

3.4Oracle内存结构

Oracle是一个内存消耗大户,它消耗的内存可以分为两部分——进程共享部分和进程专有部分,这里的进程专指Oracle进程,进程共享部分称为系统全局区SGA,进程专有部分称为程序全局区PGA。

3.5Oracle内存组成

系统全局区中包含以下几个内容结构:共享池、数据库高速缓冲区、重做日志缓冲区和其他一些结构(如锁和统计数据等)。

3.6Oracle数据库进程

1.用户进程是一个需要与Oracle Server交互的程序,该进程是一个运行在客户端,并独立出来的一种进程。

2.服务器进程是一个直接与Oracle Server交互的程序,与Oracle Server运行在同一台机器上,使用PGA执行用户进程发出的调用,并向用户进程返回结果状态和结果信息。

3.后台进程用于维护物理存储与内存中的数据之间的关系。

第15章 Oracle的事务与锁

Oracle中提供了多种数据完整性的保证机制,如触发器、事务和锁等。

事务是Oracle中的基本工作单元,是用户定义的一个数据库操作序列,事务管理的主要功能是为了保证一批相关数据库中数据的操作能全部被完成,从而保证数据的完整性。

15.1事务的概念

事务用于保证数据的一致性,它由一组相关的DML(数据操作的——增、删、改)语句组成,该组的DML语句要么全部执行成功,要么全部失败。

15.1.4事务管理的语句

一个事务中可以包含一条语句或者多条语句甚至一段程序,一段程序中也可以包含多个事务。事务可以根据需求把一段事务分成多个组,每个组可以理解为一个事务。

Oracle中常用的事务管理语句包含如下几条:

1.commit语句:提交事务语句,使用该语句可以把多个步骤对数据库的修改,一次性地永久写入数据库,代表数据库事务的成功执行。

2.rollback语句:事务失败时执行回滚操作语句,使用该语句在发生问题时,可以把对数据库已经做出的修改撤销,回退到修改之前的状态。在操作过程中,一旦发生问题,如果还没有提交操作,则随时可以使用rollback来撤销前面的操作。

3.savepoint语句:设置事务点语句,该语句用于在事务中间建立一些保存点,rollback可以使操作回退到这些点上边,而不必撤销全部操作。一旦commit提交事务完成,就不能用rollback来取消已经提交的操作。一旦rollback完成,被撤销的操作要重做,必须重新执行相关提交事务操作的语句。

15.2锁的应用

数据库是一个多用户使用的共享资源,当多个用户并发地存取数据时,在数据库中就会产生多个事务同时存取同一数据的情况,若对并发操作不加控制,就可能会读取和存储不正确的数据,破坏数据库的一致性,为解决这一问题,Oracle数据库提出了锁机制。

15.2.1.锁的概念

Oracle的锁机制主要是执行对多个活动事务的并发控制,它可以控制多个用户对同一数据进行的操作,使用锁机制,可以解决数据库的并发问题,从而保证数据库的完整性和一致性。

从事务的分离性可以看出,当前事务不能影响其他的业务,所以,当多个会话访问相同的资源时,数据库里利用锁确保它们像队列一样依次进行。

如果不使用锁机制,对数据的并发操作会带来下面一些问题:脏读、幻读、非重复性读取、丢失更新。

1.脏读:当一个事物读取的记录是另一个事务的一部分时,如果第一个事务正常完成,就没什么问题,如果此时另一个事物未完成,就产生了脏读。

2.幻读:当某个数据行执行insert和delete操作,而该数据行恰好属于某个事务正在读取的范围时,就会发生幻读现象。

3.非重复性读取:如果一个事务不止一次读取相同的记录,但在两次读取中间有另一个事务刚好修改了数据,则两次读取的数据将出现差异,此时就发生了非重复性读取。

4.丢失更新:一个事务更新了数据库之后,另一个事务再次对数据库更新,此时系统只能保留最后一个数据的修改。

15.2.2锁的分类

在数据库中有两种基本的锁:排它锁即X锁和共享锁即S锁。

1.排他锁:当数据对象被加上排他锁时,其他的事务不能对它读取和修改。

2.共享锁:加了共享锁的数据对象可以被其他事物读取,但不能修改。

根据保护对象的不同,Oracle数据库可分为如下几种:

DML lock数据锁:用于保护数据的完整性。

DDL lock字典锁:用于保护数据库对象的结构(如表、视图、索引的结构定义)。

内部锁:保护内部数据库结构。

分布式锁:用于OPS(并行服务器)中。

并行高速缓存管理锁:于OPS(并行服务器)中。

在Oracle中最主要的锁是DML锁,DML锁的目的在于保证并发情况下的数据完整性。在Oracle数据库中,DML锁主要包括TM锁和TX锁,其中TM锁称为表级锁,TX锁称为事务锁或行级锁。

锁出现在数据共享的场合,用来保证数据的一致性。当多个会话同时修改一个表时,需要对数据进行相应的锁定。

15.2.3锁的类型

锁有“共享锁”“排他锁”“共享排他锁”等多种类型,而且每种类型又有“行级锁”(一次锁住一条记录)、“页级锁”(一次锁住一页,即数据库中存储记录的最小可分配单元)、“表级锁”(锁住整个表)。

15.2.4锁等待和死锁

当程序对所做的修改进行提交(commit)或回滚(rollback)后,锁住的资源便会得到释放,从而允许其他用户进行操作。如果两个事务分别锁定一部分数据,而都在等待对方释放锁才能完成事务操作,这种情况下就会发生死锁。

1.死锁的原因

在多用户环境下,死锁的发生是由于两个事务都锁定了不同的资源的同时又都申请对方锁定的资源,即一组进程中的各个进程均占有不会释放的资源,但因互相申请其他进程占用的不会释放的资源而处于一种永久等待的状态。

3.减少死锁的策略

复杂的系统中不可能百分之百地避免死锁,从实际出发,为了减少死锁,可以采用一下策略:

1.在所有事务中以相同的次序使用资源。

2.使事务尽可能简短并且在一个批处理中。

3.为死锁超时参数设置一个合理范围,如3~30分钟;超时,则自动放弃本次操作,避免进程挂起。

4.避免在事务内和用户进行交互,减少资源的锁定时间。

面试官:事务和锁有什么关系?

Oracle中可以使用多种机制来确保数据的完整性,如约束、触发器及本章介绍的事务和锁等。

事务和锁的关系非常紧密。事务包含一系列操作,这些操作要么全部成功,要么全部失败,通过事务机制管理多个事务,保证事务的一致性,事务中使用锁保护指定的资源,防止其他用户修改另外一个还没有完成的事务中的数据。

你可能感兴趣的:(oracle,数据库)