您好,欢迎访问三七文档
当前位置:首页 > IT计算机/网络 > 数据库 > Oracle-10g基础教程-事务和并发
第10章事务处理和并发控制教学目标教学难点和重点教学过程理解和掌握并发性的基本概念理解和掌握事务处理的特点掌握事务管理技术理解事务的ACID属性掌握并发控制技术理解悲观锁定和乐观锁定的概念教学目标并发性的基本概念事务处理的特点事务管理技术事务的ACID属性并发控制技术悲观锁定和乐观锁定的概念教学难点和重点10.1概述10.2事务管理技术10.3事务的ACID属性10.4并发控制教学过程并发性就是两个或两个以上的用户同时对个数据执行的操作。并发性问题就是并发操作时遇到的各种问题。在OracleDatabase10g系统中,解决并发性问题采取了事务处理和锁定机制。事务处理和锁是两个紧密联系的概念。事务就是一个单元的工作,包括一系列的操作。这些操作要么全部成功,要么全部失败。事务确保多个数据的修改作为一个单元来处理。Oracle通过支持事务机制管理多个事务,保证事务的一致性。事务使用锁,防止其他用户修改另外一个还没有完成的事务中的数据。对于多用户系统来说,锁定机制是必须的。10.1概述用户不能显式地开始一个事务处理。事务处理会隐式地开始与第一条修改数据的语句,或者一些要求事务处理的场合。使用commit或rollback语句将会显式地终止事务处理。事务处理具有原子性,即要么所有的语句都成功地执行,要么所有语句都不能成功地执行。Oracle提供了许多事务处理控制语句,用户可以用来控制这种行为。主要的事务处理控制语句包括:commitrollbacksavepointrollbacktosavepointsettransactionsetconstraints10.2事务管理技术在事务处理的最简单形式中,用户只需使用SQL的commit命令即可。提交会结束用户的事务处理,并且使用户已经执行的任何改变永久生效。作为开发人员,用户应该使用commit或rollback显式终止用户的事务处理,否则用户正在使用的工具或环境就将为用户选取其中的一种方式。例如,如果用户没有进行提交或回滚就退出了用户的SQL*Plus会话,那么SQL*Plus就会认为用户希望提交用户工作。无论用户是否想要提交,都会为用户进行提交。commit处理回滚可以让我们撤销我们的工作。当我们的应用中出现错误,或运行我们程序的终端用户决定不保存他们所做的改变时,就可能需要进行回滚。如果不能够回滚错误或用户命令,我们就无法支持数据库中的事务处理。在其最简单的形式中,我们只需使用rollback。回滚可以终止用户的事务处理,并且撤销用户已经进行的所有改变。完成这项工作需要读取用户存储在回滚段或undo表空间中的信息,将数据库块恢复到用户事务处理开始之前的状态。rollback处理savepoint可以让用户在事务处理中建立标记点。用户可以在单独的事务处理中拥有多个保存点。当使用rollbacktosavepoint时,他就可以让用户有选择地回滚更大的事务处理中的一组语句。用户可以将事务处理回滚到标记点,但是不回滚它之间的任何工作。savepoint和rollbacktosavepointsettransaction语句可以使用户设置事务处理的各种属性,例如它的隔离层次、它是只读的还是可以进行读写的、是否需要使用特定的回滚段等。settransaction语句必须是事务处理中使用的第一个语句。也就是说,必须在任何insert、update或delete语句以及任何其他可以开始事务处理的语句之前使用它。settransaction语句的作用域只是当前的事务处理。只要用户进行了提交或回滚,settransaction语句的结果才会完整。settransaction在Oracle中,约束可以在DML语句执行之后立即生效,也可以延迟到事务处理提交时才生效。setconstraint语句可以让用户在事务处理中设置延迟约束的强制模式。可以使用下面的语法形式延迟单独的约束:setconstraintconstraint_namedeferred也可以使用如下的语法形式延迟所有的约束:setconstraintalldeferredsetconstraintACID是原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability)的首字母缩写。原子性表示事务处理要么全部进行,要么全部不进行。一致性表示事务处理要将数据库从一种状态转变为另一种状态。隔离性表示在事务处理提交之前,事务处理的效果不能由系统中其他事务处理看到。持久性表示一旦提交了事务处理,它就永久生效。ACID特性描述了事务处理的规则。下面详细讲述事务的这些属性。10.3事务的ACID属性在Oracle系统中,事务处理具有原子性。换句话说,或者提交所有的工作,或者什么工作都不提交。下面,通过一个示例讲述原子性的特点。在如图10-7所示的代码中,我们创建了一个只有一个列的t表。该表将用于我们的实验中。原子性这是非常重要的事务处理特性,任何事务处理都会将数据库从一种逻辑上的一致状态转变为另一种逻辑上的一致状态。这就是说,在事务处理开始之前,数据库中的所有数据都会满足已经施加给数据库的业务规则(约束)。与此相似,当提交了事务处理之后,数据库仍然会满足施加的所有业务规则。下面,通过一个示例,分析临时逻辑不一致的现象。一致性隔离性隔离层次脏读取非可重复读取影像读取非提交读取(readuncommitted)允许允许允许提交读取(readcommitted)禁止允许允许可重复读取(repeatableread)禁止禁止允许串行读取(serializable)禁止禁止禁止持久性是数据库提供的最重要的特性之一。它可以确保一旦事务处理提交之后,它的改变就会永久生效。他们不会由于系统故障或错误而消失。数据库通过在线重做日志(也称为事务处理日志),可以确保当系统发生故障或崩溃时,能够提供复原数据所需的全部信息。持久性如何最大化并发访问的效率,如何确保每个用户都能在一致的方式下读取和修改数据,这些都是需要通过并发控制解决的问题。本节主要讨论Oracle如何锁定数据,以及这种锁定模型对编写多用户应用的影响。10.4并发控制锁定(lock)是用来控制共享资源并发访问的机制。这里使用了共享资源,没有使用数据库行或数据库表。Oracle不仅可以在行级别上所定表数据,而且还可以在许多不同的层次上使用锁定,提供对各种资源的并发访问。例如,当执行存储过程时,过程本身就会处于锁定模式,允许其他用户执行它,但是不允许另外的用户采用任何方式改变它。在数据库中,可以使用锁来控制这些共享资源进行并发访问,同时提供数据完整性和一致性。锁定死锁就是两个会话都进入了彼此等候对方的状态时的一种停止状态。当两个用户占用了两者都希望使用的资源时,就会出现死锁。Oracle处理死锁的方式非常简单。当检测出死锁时,Oracle就会选择其中一个会话作为“牺牲者”。该会话将会获得错误信息,通知它所要访问的资源已经被其他会话锁定(就是被阻塞、等待牺牲者所锁定的资源的会话)。死锁可以在许多层次上进行锁定。用户可以把锁定放在一行上,也可以把锁定放在一个表上,甚至还可以把锁定放在整个数据库上。在有些数据库系统中,锁定是稀缺的资源,拥有许多锁定可以负面地影响系统的性能。在这些数据库中,用户可以发现,为了保存这些资源,用户的100个行级锁定就会转换为一个表级锁定。这种过程就是锁定升级,它使得系统降低了用户锁定的粒度。换句话说,用户以前可能拥有很多行级锁定,现在可以拥有一个更高级别的单独锁定,可以使用一个锁来锁定以前需要锁定的所有资源。锁定升级阻塞的主要原因是在没有锁定的数据上进行更新。这是很明显的,如果没有更新它,当然就不会对其进行锁定。阻塞最常出现在交互式的应用中。这些应用会从数据库中读取一些数据,并且可以让用户在屏幕上修改这些数据。当用户按下Submit按钮时,就会通过更新将改变应用于数据库。随后,用户可以按下Save按钮使得改变永久生效。这样,就会出现阻塞。如果其他的用户也要读取相同的数据,他们在第一个用户操作之前按下了Submit,那么他们就会锁定数据。第一个用户按下Save时就会发生阻塞。解决的办法是不要在每次更新之后都盲目地进行提交。这种特定的问题经常会出现,被称为遗失更新。遗失更新悲观锁定听起来不太好,实际上并非如此。在使用悲观锁定时,实际上就是表明:我认为,某人很有可能会改变我正在读取的相同数据,因此,在我们花费时间改变数据之前,我要锁定数据库中的行,防止其他会话更新它。采用悲观锁定,就是在选取数据之前,对其进行锁定。悲观锁定第二种方法称为乐观锁定,它会在应用中同时保存旧值和新值。当更新数据时,我们可以使用一个更新将列设置为他们的新值,与此同时,验证数据库中的数据行是否具有与我们读取它时相同的值。乐观锁定Oracle使用了多版本读取一致性并发模型。Oracle通过这个机制可以提供:读取一致性查询,即能够产生结果与相应的时间点一致的查询;非阻塞查询,即查询不会被数据写入器阻塞。这是Oracle数据库中非常重要的两个概念。多版本的含义是,Oracle能够同时在数据库中维护多个数据版本。如果用户要理解多版本的工作方式,那么用户就首先要理解如何从数据库中获得查询结果。图10-30展示了一个简单的多版本示例。多版本和读取一致性
本文标题:Oracle-10g基础教程-事务和并发
链接地址:https://www.777doc.com/doc-7798309 .html