Oracle9i第11章 事务和锁

相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第十三章 事务和锁
事务
事务是指一个或多个SQL语句所组成的序列,是对数据库操作的 逻辑单位。连续的执行提交操作(COMMIT)或回退操作 (ROLLBACK)之间的操作称为一个事务。 事务处理就是面向逻辑单元的一种处理形式,它能够在事务处 理期间发生了系统故障或用户进程故障时,使数据库自动地被 恢复到该事务起始前的状态,即整个事务自动回滚,从而避免 了一个事务中的一部分提交而产生数据不一致的错误。 对于一个事务中数据的更新操作来说,相互之间不是独立的, 而是构成一个整体,从而保证数据的一致性。
事务的提交
数据库数据的更新操作提交以后,这些更新操作就不能再撤消。事务 的提交有3种方式: 显示提交 在SQL PLUS中,使用COMMIT命令来提交所有未提交的更新操作就是显 示提交。 隐式提交 有些命令,如CREATE、DROP、ALTER、GRANT、REVOKE、CONNECT、 DISCONNECT、EXIT、RENAME、AUDIT、NOAUDIT和COMMENT命令,以及 退出SQL PLUS都是隐含COMMIT操作,而无须指明该操作。只要使用这 些命令,系统就会提交以前的更新操作,就像使用了COMMIT命令一样。
数据锁从根本上来说是保护数据的完整性。
当用户对表中数据执行INSERT、UPDATE和DELETE操作时将要用 到数据锁,它用来保护数据的一致性。
按级别来分可分为行级锁和表级锁两种。
调用DDL语句会隐式提交事务。
DML锁的用途 保护被多个用户并行存取的数据的完整性。DML锁可以防止同时 进行的DML操作的破坏性干扰。
字典(DDL)锁 字典(DDL)锁 (DDL)
当用户创建、修改或者删除表时将要用到字典锁。它通常是表 级锁,用来防止两个用户同时修改一个表的结构。
专用DDL锁 当诸如CREATE、ALTER和DROP这样的语句用于一个对象时使用此锁。
专用DDL锁的特征是假如另外一个用户保留了任何级别的锁的话,那 么本用户将不能得到表中的专用DDL锁。
共享锁(Share, S):假如一个事务持有一个共享表锁,那么它便防止 其它事务在该表中执行DML操作。
共享行专用(Share Row Execlusive, SRX):假如一个事务包含一个 SRX表锁,那么它防止其它事务执行DML或SELECT……FOR UPDATE语句。
专用(Execlusive, X):专用锁是表锁的最具限制性的形式,它允许 持有表锁的事务对该表进行独占操作。
死锁
死锁是指两个用户都在等待被彼此相互锁定的同一数据而形成 的一种局面。
小结
本章主要介绍了Oracle的锁机制。
锁是用来保护数据库的写一致的,通过不同级别的锁,可以对 用户修改数据事件排序。
自动提交 用户可以使用SET命令来设置自动提交环境。如下所示: SET AUTO ON 经过设置后,SQL PLUS会自动提交用户的更新工作。 一旦设置了自动提交,用户每一次执行DML语句(INSERT、UPDATE和 DELETE语句),系统将会立即自动进行提交。
事务的回滚
尚未提交的INSERT、UPDATE或DELETE操作可以使用ROLLBACK命令进 行撤消。示例: SQL> rollback; 对于一个已经提交的更新操作是不能使用ROLLBACK命令进行撤消的。 如果显式、隐式或自动提交一系列事务,ROLLBACK命令将不起作用。 如果在完成一系列更新操作后没有进行提交,并且随后又遇到一系 列麻烦,如计算机故障,Oracle将取消所有没有提交的工作。
保存点
保存点可以将每一个事务划分成若干个保存点每次可以回滚到指定保 存点。
设置保存点的命令如下所示: SAVEPOINT pointname;
回滚到保存点的命令如下所示: ROLLBACK pointname;
锁Baidu Nhomakorabea
Oracle主要有两种不同类型的锁:数据锁和字典锁。
数据操作(DML)锁 数据操作(DML)锁 (DML)
例如,另一个用户在该表上有一个未提交的事务,那么对此表的 ALTER TABLE语句将会失效。
共享DDL锁 当诸如GRANT和GREATE PACKAGE这样的语句用于一个对象时使用此锁。 共享锁的特征是一个共享DDL锁不能阻止类似的DDL语句或任何DML语 句用于一个对象上,但是它能防止另一个用户改变或删除已引用的对 象。 共享DDL锁的另一个特征是在DDL语句执行期间它一直维持,直到发生 一个隐含的提交。
例如,DML锁保证一张表中的指定行一次仅能被一个事务修改。 它们还保证如果对某个表的DML操作事务还未提交时,该表便不 能被删除。
DML锁的模式
下面列举了用于DML的Oracle锁模式: 行共享(Row Share, RS):行共享锁是一个共享的表锁。它是一个在 被查询行上的专用锁。 行专用(Row Execlusive, RX):行专用锁通常表明持有该锁的事务 已经对表中的行完成了一次或多次修改。
对事务的控制包含事务提交、事务回滚和设立保存点。
在Oracle中规定,提交之后的更新操作是不能撤消的,未提交的更新 操作是可以撤消的。这种操作可以通过COMMIT和ROLLBACK命令来实现。
在提交之前,只有修改了数据的用户才能看到数据的改变,而其它用 户看到的是改变之前的数据。在提交之后,数据库的数据才会真正改 变,这时其它用户和修改数据用户看到的内容是一致的。
手工锁定
假如想执行一张表中列值的全局更新并且希望事务对该表进行 单独存取,以便该事务不必等待其它事务完成该表的操作,那 么可以通过人工锁定该表以防止其它事务获得该表中的锁,从 而实现这一点。 示例: 执行如下操作将获得共享模式锁: LOCK TABLE EMP IN SHARE MODE 执行如下操作将获得专用模式锁: LOCK TABLE EMP IN EXECLUSIVE MODE
相关文档
最新文档