??xml version="1.0" encoding="utf-8" standalone="yes"?>
讄锁机制主要是ؓ了对q发操作q行控制Q对q扰q行锁Q保证数据的一致性和准确性。Oracle数据库封锁方式有三种Q共享封锁,独占锁Q共享更新封?
[b:8f4f63b9bb]锁cd[/b:8f4f63b9bb]
Oracle RDBMS的封锁类型可分ؓ如下三类Q?
Q、内部锁
内部U封锁是用于保护ORACLE内部l构Q由pȝ内部实现Q用户不能访问,因此我们不必Ҏ做过多的了解?
Q、DDLU封锁(字典/语法分析锁Q?
DDLU封锁也是由ORACLE RDBMS来控Ӟ它用于保护数据字典和数据定义改变时的一致性和完整性。它是系l在对SQL定义语句作语法分析时自动地加锁,无需用户q予。字?语法分析锁共分三类Q?
Q1Q、字典操作锁Q用于对字典操作Ӟ锁住数据字典Q此锁是独占的Q从而保护Q何一个时M能对一个字典操作?
Q2Q、字典定义锁Q用于防止在q行字典操作时又q行语法分析Q这样可以避免在查询字典的同时改动某个表的结构?
Q3Q、表定义锁:用于 一个SQL语句正当讉K某个表时Q防止字怸与该表有关的目被修攏V?
Q、DMLU封?
DMLU封锁用于控制ƈ发事务中的数据操U,保证数据的一致性和完整性,其封锁对象可以是表或行?
对用L数据操纵QOracle可以自动为操U늚数据q行锁Q但如果有操U|权,则ؓ满q发操纵的需要另外实施封锁。DML锁可由一个用戯E以昑ּ的方式加锁,也可通过某些SQL语句隐含方式实现?BR>DML锁有如下三种锁方式Q?
Q?Q、共享封锁方式(SHAREQ?
Q?Q、独占封锁方式(EXCLUSIVEQ?
Q?Q、共享更新封锁(SHARE UPDATEQ?
其中SHAREQEXCLUSIVE用于表封锁,SHARE UPDATE用于行封锁?
1、共享方式的表封?
׃n方式的表锁是对表中的所有数据进行封锁,该锁用于保护查询数据的一致性,防止其它用户对已锁的表q行更更新。其它用户只能对该表再施加共享方式的锁,而不能再对该表施加独占方式的锁Q共享更新锁可以再施加,但不允许持有׃n更新锁的进E做更新。共享该表的所有用户只能查询表中的数据Q但不能更新。共享方式的表封锁只能由用户用SQL语句来设|,句格式如下:
[quote:04b72348bd]LOCK TABLE <表名>[,<表名>]...
IN SHARE MODE [NOWAIT]
[/quote:04b72348bd]
执行该语句,对一个或多个表施加共享方式的表封锁。当指定了选择NOWAITQ若该封锁暂时不能施加成功,则返回ƈq户决定是q行{待Q还是先L行别的语句?
持有׃n锁的事务Q在出现如下之一的条件时Q便释放其共享锁Q?
A、执行COMMIT或ROLLBACK语句?
B、退出数据库QLOG OFFQ?
C、程序停止运行?
׃n方式表封锁常用于一致性查询过E,卛_查询数据期间表中的数据不发生改变?
2、独占方式表锁
独占方式表封锁是用于锁表中的所有数据,拥有该独占方式表锁的用P卛_以查询该表,又可以更新该表,其它的用户不能再对该表施加Q何封锁(包括׃n、独占或׃n更新锁Q。其它用戯然不能更新该表,但可以查询该表?
独占方式的表锁可通过如下的SQL语句来显C地获得Q?
LOCK TABLE <表名>[,<表名>]....
IN EXCLUSIVE MODE [NOWAIT]
独占方式的表锁也可以在用户执行DML语句INSERT、UPDATE、DELETE旉含获得?
拥有独占方式表封锁的事务Q在出现如下条g之一Ӟ侉K放该锁Q?
Q?Q、执行COMMIT或ROLLBACK语句?
Q?Q、退出数据库QLOG OFFQ?
Q?Q、程序停止运行?
独占方式锁通常用于更新数据Q当某个更新事务涉及多个表时Q可减少发生死锁?
DML锁有如下三种锁方式Q?
Q?Q、共享封锁方式(SHAREQ?
Q?Q、独占封锁方式(EXCLUSIVEQ?
Q?Q、共享更新封锁(SHARE UPDATEQ?
其中SHAREQEXCLUSIVE用于表封锁,SHARE UPDATE用于行封锁?
1、共享方式的表封?
׃n方式的表锁是对表中的所有数据进行封锁,该锁用于保护查询数据的一致性,防止其它用户对已锁的表q行更更新。其它用户只能对该表再施加共享方式的锁,而不能再对该表施加独占方式的锁Q共享更新锁可以再施加,但不允许持有׃n更新锁的进E做更新。共享该表的所有用户只能查询表中的数据Q但不能更新。共享方式的表封锁只能由用户用SQL语句来设|,句格式如下:
[quote:04b72348bd]LOCK TABLE <表名>[,<表名>]...
IN SHARE MODE [NOWAIT]
[/quote:04b72348bd]
执行该语句,对一个或多个表施加共享方式的表封锁。当指定了选择NOWAITQ若该封锁暂时不能施加成功,则返回ƈq户决定是q行{待Q还是先L行别的语句?
持有׃n锁的事务Q在出现如下之一的条件时Q便释放其共享锁Q?
A、执行COMMIT或ROLLBACK语句?
B、退出数据库QLOG OFFQ?
C、程序停止运行?
׃n方式表封锁常用于一致性查询过E,卛_查询数据期间表中的数据不发生改变?BR>
2、独占方式表锁
独占方式表封锁是用于锁表中的所有数据,拥有该独占方式表锁的用P卛_以查询该表,又可以更新该表,其它的用户不能再对该表施加Q何封锁(包括׃n、独占或׃n更新锁Q。其它用戯然不能更新该表,但可以查询该表?
独占方式的表锁可通过如下的SQL语句来显C地获得Q?
LOCK TABLE <表名>[,<表名>]....
IN EXCLUSIVE MODE [NOWAIT]
独占方式的表锁也可以在用户执行DML语句INSERT、UPDATE、DELETE旉含获得?
拥有独占方式表封锁的事务Q在出现如下条g之一Ӟ侉K放该锁Q?<BR>Q?Q、执行COMMIT或ROLLBACK语句?
Q?Q、退出数据库QLOG OFFQ?
Q?Q、程序停止运行?
独占方式锁通常用于更新数据Q当某个更新事务涉及多个表时Q可减少发生死锁?
3、共享更新封锁方?
׃n更新锁是对一个表的一行或多行q行锁Q因而也UC行锁。表U封锁虽然保证了数据的一致性,但却减弱了操作数据的q行性。行U封锁确保在用户取得被更新的行到该行q行更新q段旉内不被其它用h修改。因而行U锁卛_保证数据的一致性又能提高数据操作的q发性?
可通过如下的两U方式来获得行锁Q?
Q?Q、执行如下的SQL锁语句Q以昄的方式获得:
LOCK TABLE <表名>[,<表名>]....
IN SHARE UPDATE MODE [NOWAIT]
Q?Q、用如下的SELECT ...FOR UPDATE语句获得Q?
SELECT <列名>[,<列名>]...
FROM <表名>
WHERE <条g>
FOR UPDATE OF <列名>[,<列名>].....[NOWAIT]
一旦用户对某个行施加了行锁Q则该用户可以查询也可以更新被封锁的数据行,其它用户只能查询但不能更新被锁的数据行Q如果其它用h更新该表中的数据行,则也必须对该表施加行U锁Q即使多个用户对一个表均用了׃n更新Q但也不允许两个事务同时对一个表q行更新Q真正对表进行更新时Q是以独占方式封锁表Q一直到提交或复原该事务为止。行锁永q是独占方式锁?
当出现如下之一的条Ӟ侉K攑օ享更新锁Q?
Q1Q、执行提交(COMMITQ语句;
Q2Q、退出数据库QLOG OFFQ?
Q3Q、程序停止运行?
执行ROLLBACK操作不能释放行锁?
从上面讲q可见,ORACLE RDBMS的加锁机Ӟ解决了ƈ发事务的相容与互斥问题。相容保证事务的q发性,互斥保数据的一致性。不同用户锁的相容与互斥关系׃囄出?
其中最后一行最后一列ؓ其它用户提供在不同行上设|SHARE UPDATE锁。但当用P在某行上q行更新操作Ӟ用户Q只有等待用P提交事务后,才能更新自己所锁的行?BR>
中最后一行最后一列ؓ其它用户提供在不同行上设|SHARE UPDATE锁。但当用P在某行上q行更新操作Ӟ用户Q只有等待用P提交事务后,才能更新自己所锁的行?BR>死锁
锁虽然能够有效的解军_ƈ发操作,但是M资源的独占都会有死锁的危险。例如:有两个事务T1QT2QT1Ҏ据A施加独占锁QT2Ҏ据B施加了独占封锁。再假设T1要对数据B加锁Q由于B已被T2独占锁Q因此T1|于{待状态,{待B被释放;现在若T2也要对Aq行锁Q由于A已被T1独占锁Q因此T2也被|于{待状态。这样就形成了两个事务相互等待的状态,而且永远不能l束Q此U情늧为死锁?
在Oraclepȝ中能自动发现死锁Qƈ选择代h最的Q即完成工作量最的事务予以撤消Q释放该事务所拥有的全部锁Q记其它的事务l工作下厅R?
从系l性能上考虑Q应该尽可能减少资源竞争Q增大吞吐量Q因此用户在lƈ发操作加锁时Q应注意以下几点Q?
Q、对于UPDATE和DELETE操作Q应只封锁要做改动的行,在完成修改后立即提交?
Q、当多个事务正利用共享更新的方式q行更新Q则不要使用׃n锁Q而应采用׃n更新锁Q这样其它用户就能用行U锁Q以增加q行性?
Q、尽可能对一个表的操作的q发事务施加׃n更新锁,从而可提高q行性?
Q、在应用负荷较高的期_不宜对基数据l构Q表、烦引、簇和视图)q行修改
]]>
>1 DECLARE
>2 msg VARCHAR2(20);
>3 BEGIN
>4 msg := 'Hello PL/SQL!';
>5 DBMS_OUTPUT.PUT_LINE(msg);
>6 END;
>7 /
q是W一个PL/SQLE序Q它是一个Anonymous blocksQ?BR>另外q有两种形式的程序: Procedures && FunctionsQ?BR>***************Procedures**************
/* q程hello */
>1 CREATE PROCEDURE hello( )
>2 IS
>3 msg VARCHAR2(20) := message_for_hello;
>4 BEGIN
>5 DBMS_OUTPUT.PUT_LINE(msg);
>6 END;
>7 /
***************************************
*************Functions******************
/* 函数message_for_hello */
>1 CREATE FUNCTION message_for_hello
>2 RETURN VARCHAR2
>3 AS
>4 BEGIN
>5 RETURN 'Hello PL/SQL!';
>6 END;
>7 /
***************************************
通过q程hello调用函数message_for_hello完成?Hello PL/SQL'Q?BR>q可以通过触发器来完成Q触发器主要?BR> 1) 三个语句(INSERT/UPDATE/DELETE);
2) 二种cd(之前/之后);
3) 二种U别(row-level/statement-level);
**************Trigger*******************
>1 CREATE OR REPLACE TRIGGER UpdateMajorStats AFTER
>2 INSERT OR DELETE OR UPDATE ON students
>3 DECLARE
>4 msg VARCHAR2(20) := message_for_hello;
>5 BEGIN
>6 DBMS_OUTPUT.PUT_LINE(msg);
>7 END;
****************************************
后箋q得学习基本的控制语句,控制程Q还有包Q异常等Q?BR>待箋、、、、、、、、?BR>