第12章 事务处理与并发控制_第1页
第12章 事务处理与并发控制_第2页
第12章 事务处理与并发控制_第3页
第12章 事务处理与并发控制_第4页
第12章 事务处理与并发控制_第5页
已阅读5页,还剩33页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

.,1,第12章事务处理与并发控制,.,2,主要内容,12.1概述12.2事务管理技术12.3事务的ACID属性12.4并发控制,.,3,12.1概述,并发性就是两个或两个以上的用户同时对一个数据执行的操作。并发性问题就是并发操作时遇到的各种问题。OracleDatabase10g系统在解决并发性问题时采取了事务处理和锁定机制。事务处理和锁是两个紧密联系的概念。事务就是一个单元的工作,包括一系列的操作,这些操作要么全做,要么全不做。事务确保多个数据的修改作为一个单元来处理。例如,在银行业务中,有一条记帐原则,即有借必有贷,借贷必相等。因此,为了保证这种原则,就得有确保借和贷的登记要么同时成功,要么同时失败,如果出现只记录了借,或只记录了贷,那么就违反了记帐原则,就会出现记错帐的情况。Oracle通过支持事务机制管理多个事务,保证事务的一致性。事务使用锁,防止其它用户修改另外一个还没有完成的事务中的数据。对于多用户系统来说,锁定机制是必须的。,.,12.2数据库的事务,以第一个DML语句的执行作为开始以下面之一作为结束:COMMIT或ROLLBACK语句DDL或DCL语句(自动提交)用户会话正常结束系统异常终了,.,5,一个事务的生命周期包括:事务开始、事务执行和事务结束。在Oracle中,并不会显式声明事务的开始,而是由Oracle自行处理。事务的结束可以利用commit或者rollback命令。Oracle提供了许多事务处理控制语句,主要的事务处理控制语句包括:commit、rollback、savepoint、rollbacktosavepoint、settransaction以及setconstraints语句等。,.,6,1.Commit的处理,在事务处理的最简单的形式中,用户只需使用SQL的commit命令即可。提交会结束用户的事务处理,并且使用户已经执行的任何改变永久生效。作为开发人员,用户应该使用commit或rollback显式终止用户的事务处理,否则用户正在使用的工具或环境就将为用户选择其中的一种方式。例如,如果用户没有进行提交或回滚就退出了用户的SQL*Plus会话,那么SQL*Plus就会认为用户希望提交用户工作。无论用户是否想要提交工作,系统都会为用户进行提交。,.,Commit事务提交命令,Oracle在内存中将为每个客户机建立工作区,客户机对数据库进行操作处理的事务都在工作区内完成,只有在输入commit命令后,工作区内的修改内容才写入到数据库上,称为物理写入.这样可以保证在任意的客户机没有物理提交修改以前,别的客户机读取的后台数据库中的数据是完整的、一致的.,.,8,Commit时执行的任务,为用户的事务处理申请SCN(systemchangenumber,系统改变编号)。这是Oracle的内部时钟,可以称为数据库时间。SCN不是传统意义上的时钟,因为它不是随着时间推移而递进。相反,他是在事务处理提交时递进,由Oracle在内部使用,以对事务处理排序。将所有剩余的已经缓冲的重做日志表项写入磁盘,并且将SCN记录到在线重做日志文件中。这要由数据库后台进程LGWR执行。这一步实际上就是所谓的“提交”,使事务处理永久生效。释放用户会话所占有的所有锁定。,.,9,2.rollback处理,回滚可以允许用户撤销其工作。当应用中出现错误,或运行程序的终端用户决定不保存其所做的改变时,可能需要进行回滚。如果不能够回滚错误或用户命令,就无法支持数据库中的事务处理。在回滚处理最简单的形式中,只需使用rollback。回滚可以终止用户的事务处理,并且撤销用户已经进行的所有改变。完成这项工作需要读取用户存储在回滚段或undo表空间中的信息,将数据库恢复到用户事务处理开始之前的状态。与提交不同,回滚事务处理的时间是所改变数据量的函数。这是可以预料的,因为回滚必须在物理上撤销用户已经完成的工作。,.,ORACLE事务控制-回退段,ORACLE为了适应事务控制设置了回退段这一数据库对象.系统利用回退段来确保诸如读一致性、数据库恢复等管理功能。ORACLE在缺省情况下,读数据不加锁,通过回退段(RollbackSegment)保证用户不读脏数据和可重复读.表空间中的数据按段来组织,数据段、索引段、暂存段和回退段,回退段是一块磁盘存储区域,回退段可以由用户创建,但只能由系统进程使用。,.,3.自动提交的事务,当执行DDL语句时会自动提交事务,当执行DCL语句(grantrevoke)当退出SQL*Plus时,.,12,4.savepoint和rollbacktosavepoint,savepoint允许用户在事务处理中建立标记点。用户可以在单独的事务处理中拥有多个保存点。当使用rollbacktosavepoint时,就可以让用户有选择地回滚更大的事务处理中的一组语句。用户可以将事务处理回滚到标记点,但是不回滚它们之间的任何工作。例:用户可以使用两个update语句,然后再使用一个savepoint。在savepoint之后,用户可以使用两个delete语句,当遇到某种类型的错误时,用户就可以回滚到指定的savepoint处。这将会撤销delete语句,但是却不会撤销以前的两个update语句。应该注意到,rollbacktosavepoint只会撤销用户所做的一部分工作,直到用户使用了commit或rollback时,用户的事务处理才会结束。保存点是很有用的事务处理特性,它们可以让用户将单独的大规模事务处理分割成一系列较小的部分。,.,13,5.settransaction,settransaction语句可以使用户设置事务处理的各种属性,例如,它的隔离层次,它是只读的还是可以进行读写的;是否需要使用特定的回滚段等。settransaction语句必须是事务处理中第一个使用的语句。也就是说,必须在任何insert、update或delete语句以及任何其他可以开始事务处理的语句之前使用它。settransaction语句的作用域只是当前的事务处理。只要用户进行了提交或回滚,settransaction语句的结果才会完整。settransactionreadonlysettransactionreadwritesettransactionisolationlevelserializablesettransactionisolationlevelreadcommitted,.,14,readonly,使用settransactionreadonly命令可以完成两件事情。第一,它会确保用户无法执行修改数据的DML操作,例如,insert、update或delete。如果执行了这样的操作,则系统就会发出错误消息。readonly事务处理的另外一个作用是,通过将事务处理设置为readonly,用户就可以有效地将其数据库视图冻结到某个时间点。也就是说,无论数据库中的其它会话如何工作,数据库在用户的前面都会是使用settransaction语句时的样子。,.,15,readwrite,readwrite是系统的默认设置,因此很少有人使用settransactionreadwrite命令,因为该命令的行为就是用户通常操作的行为。,.,16,isolationlevelserializable,settransactionisolationlevelserralizable与readonly有类似的地方。当使用了该命令之后,无论是否出现改变,数据库都会被冻结,如同用户在readonly事务处理中看到的那样,因此可以完全隔离其他事务处理的影响。用户可以看到自己进行的改变,但是不会出现其他用户的改变。,.,17,isolationlevelreadcommitted,settransactionisolationlevelreadcommitted命令相当于事务处理设置为readwrite,由于它是设置隔离层次时Oracle的默认操作模式,所以很少使用。如果用户在会话前面使用altersession命令,将用户会话的事务处理的默认隔离层次从readcommitted改变为serializable,那么就可能会用到这个命令。使用isolationlevelreadcommitted命令可以重置默认值。,.,18,setconstraint,在Oracle中,约束可以在DML语句执行之后立即生效,也可以延迟到事务处理提交时才生效。setconstraint语句可以允许用户在事务处理中设置延迟约束的强制模式。可以使用下面的语法格式延迟单独的约束:setconstraintconstraint_namedeferred也可以使用如下的语法格式延迟所有的约束:setconstraintalldeferred,.,19,12.3事务的ACID属性,ACID是原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability)的首字母缩写。原子性表示事务处理要么全部进行,要么全部不进行。一致性表示事务处理要将数据库从一种状态转变为另一种状态。隔离性表示在事务处理提交之前,事务处理的效果不能由系统中其他事务处理看到。持久性表示一旦提交了事务处理,它就永久生效。ACID特性描述了事务处理的规则。下面详细介绍事务的这些属性。,.,20,原子性,在Oracle系统中,事务处理具有原子性。换句话说,或者提交所有的工作,或者什么工作都不提交。,.,21,一致性,这是非常重要的事务处理特性,任何事务处理都会将数据库从一种逻辑上的一致状态转变为另一种逻辑上的一致状态。这就是说,在事务处理开始之前,数据库中的所有数据都会满足已经施加给数据库的业务规则(约束)。与此相似,当提交了事务处理之后,数据库仍然会满足施加的所有业务规则。,.,22,隔离性,隔离性是数据库允许对其中数据进行并发修改和读取的能力。隔离性不仅可用于防止其他事务处理受到当前事务处理的干扰,而且也可以防止当前事务处理受到其他事务处理的干扰。当其他用户不能看到当前的改变时,当前的用户也不能够看到其他用户的改变。考虑这样的一种情况,如果正在更新表中的一行数据(没有提交),假设当前用户可以读取包含了已改变的行数据(没有提交),那么就可能导致当前用户根据错误的、不完整的或者没有保存(可能会回滚当前用户读取的改变)的信息做出错误的决策。所以,数据库能够防止这种情况的出现是非常重要的。,.,23,隔离层次,.,24,持久性,持久性是数据库提供的最重要的特性之一。它可以确保一旦事务处理提交之后,它的改变就会永久生效。它们不会由于系统故障或错误而消失。数据库通过在线重做日志(也称为事务处理日志)确保当系统发生故障或崩溃时,提供复原数据所需的全部信息。当用户在数据库中通过insert、update和delete语句修改数据时,Oracle将会生成两种重要的信息:undo和redo。undo可以用于撤销或回滚事务处理的工作,而redo用于重做这些工作。undo的目的很清楚,它类似于字处理程序中的恢复或撤销功能。相对来说,redo的目的比较模糊。为什么要重做事务处理呢?持久性。也就是说,为了确保出现系统故障时,用户能够恢复事务处理。,.,25,12.4并发控制,如何最大化并发访问的效率,如何确保每个用户都能在一致的方式下读取和修改数据,这些都是需要通过并发控制解决的问题。锁(lock)是用来控制共享资源并发访问的机制。这里使用了共享资源,没有使用数据库行或数据库表。Oracle不仅可以在行级别上锁定表数据,而且还可以在许多不同的层次上使用锁定,提供对各种资源的并发访问。例如,当执行存储过程时,过程本身就会处于锁定模式,允许其他用户执行它,但是不允许另外的用户采用任何方式改变它。在数据库中,可以使用锁来控制这些共享资源进行并发访问,同时提供数据完整性和一致性。,.,26,1.ORACLE的锁机制,设立封锁机制主要是为了对并发操作进行控制,对干扰进行封锁,保证数据的一致性和准确性。OracleRDBMS的封锁类型可分为如下三类:.内部级封锁内部级封锁是用于保护ORACLE内部结构,由系统内部实现,用户不能访问,因此我们不必对此做过多的了解。.DDL级封锁(字典/语法分析封锁)DDL级封锁也是由ORACLERDBMS来控制,它用于保护数据字典和数据定义改变时的一致性和完整性。它是系统在对SQL定义语句作语法分析时自动地加锁,无需用户干予。字典/语法分析封锁共分三类:,.,27,()字典操作锁:用于对字典操作时,锁住数据字典,此封锁是独占的,从而保护任何一个时刻仅能对一个字典操作。()字典定义锁:用于防止在进行字典操作时又进行语法分析,这样可以避免在查询字典的同时改动某个表的结构。()表定义锁:用于一个SQL语句正当访问某个表时,防止字典中与该表有关的项目被修改,.,28,.DML级封锁DML级封锁用于控制并发事务中的数据操纵,保证数据的一致性和完整性,其封锁对象可以是表或行。对用户的数据操纵,Oracle可以自动为操纵的数据进行封锁,但如果有操纵授权,则为满足并发操纵的需要另外实施封锁。DML封锁可由一个用户进程以显式的方式加锁,也可通过某些SQL语句隐含方式实现。DML锁有如下三种封锁方式:(1)共享封锁方式(SHARE)(2)独占封锁方式(EXCLUSIVE)(3)共享更新封锁(SHAREUPDATE)其中SHARE,EXCLUSIVE用于表封锁,SHAREUPDATE用于行封锁。,.,29,1)共享方式的表封锁共享方式的表封锁是对表中的所有数据进行封锁,该锁用于保护查询数据的一致性,防止其它用户对已封锁的表进行更新。其它用户只能对该表再施加共享方式的锁,而不能再对该表施加独占方式的封锁,共享更新锁可以再施加,但不允许持有共享更新封锁的进程做更新。共享该表的所有用户只能查询表中的数据,但不能更新。共享方式的表封锁只能由用户用SQL语句来设置,基语句格式如下:LOCKTABLE,.INSHAREMODENOWAIT,.,30,执行该语句,对一个或多个表施加共享方式的表封锁。当指定了选择项NOWAIT,若该封锁暂时不能施加成功,则返回并由用户决定是进行等待,还是先去执行别的语句。持有共享锁的事务,在出现如下之一的条件时,便释放其共享锁:A、执行COMMIT或ROLLBACK语句。B、退出数据库(LOGOFF)。C、程序停止运行。共享方式表封锁常用于一致性查询过程,即在查询数据期间,表中的数据不发生改变。,.,31,2)独占方式表封锁独占方式表封锁是用于封锁表中的所有数据,拥有该独占方式表封锁的用户,即可以查询该表,又可以更新该表,其它的用户不能再对该表施加任何封锁(包括共享、独占或共享更新封锁)。其它用户虽然不能更新该表,但可以查询该表。独占方式的表封锁可通过如下的SQL语句来显示地获得:LOCKTABLE,.INEXCLUSIVEMODENOWAIT,.,32,独占方式的表封锁也可以在用户执行DML语句INSERT、UPDATE、DELETE时隐含获得。拥有独占方式表封锁的事务,在出现如下条件之一时,便释放该封锁:(1)执行COMMIT或ROLLBACK语句。(2)退出数据库(LOGOFF)(3)程序停止运行。独占方式封锁通常用于更新数据,当某个更新事务涉及多个表时,可减少发生死锁。,.,33,3)共享更新封锁方式共享更新封锁是对一个表的一行或多行进行封锁,因而也称作行级封锁。表级封锁虽然保证了数据的一致性,但却减弱了操作数据的并行性。行级封锁确保在用户取得被更新的行到该行进行更新这段时间内不被其它用户所修改。因而行级锁即可保证数据的一致性又能提高数据操作的迸发性。可通过如下的两种方式来获得行级封锁:(1)执行如下的SQL封锁语句,以显示的方式获得:LOCKTABLE,.INSHAREUPDATEMODENOWAIT(2)用如下的SELECT.FORUPDATE语句获得:SELECT,.FROMWHEREFORUPDATEOF,.NOWAIT,.,34,一旦用户对某个行施加了行级封锁,则该用户可以查询也可以更新被封锁的数据行,其它用户只能查询但不能更新被封锁的数据行。如果其它用户想更新该表中的数据行,则也必须对该表施加行级锁。即使多个用户对一个表均使用了共享更新,但也不允许两个事务同时对一个表进行更新,真正对表进行更新时,是以独占方式封锁表,一直到提交或复原该事务为止。行锁永远是独占方式锁。当出现如下之一的条件,便释放共享更新锁:()执行提交(COMMIT)语句;()退出数据库(LOGOFF)()程序停止运行。执行ROLLBACK操作不能释放行锁。从上面讲述可见,ORACLERDBMS的加锁机制,解决了并发事务的相容与互斥问题。相容保证事务的并发性,互斥确保数据的一致性。,.,35,从系统性能上考虑,应该尽可能减少资源竞争,增大吞吐量,因此用户在给并发操作加锁时,应注意以下几点:()对于UPDATE和DELETE操作,应只封锁要做改动的行,在完成修改后立即提交。()当多个事务正利用共享更新的方式进行更新,则不要使用共享封锁,而应采用共享更新封锁,这样其它用户就能使用行级锁,以增加并行性。()尽可能将对一个表的操作的并发事务施加共享更新锁,从

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论