一、oracle锁的特点
1、oracle自动施加和释放锁
2、oracle默认使用行级锁
3、oracle默认把锁的信息放在数据块中
4、oracle不支持锁的升级
5、锁在事务中使用,事务结束后oracle释放锁;如果事务撤销到保存点,则保存点之后的操作持有的锁被释放。
6、任何oracle锁模式都不影响select,反之亦然。
二、锁定的对象
1、用户对象 如表、索引、行
2、系统对象 如数据字典、内存中的共享数据结构
三、锁的粒度
oracle使用行级粒度锁定对象
四、锁的类型
1、DML锁:保护表或者索引中的数据。在进行DML操作时,oracle在被更改的行上施加行级锁
2、DDL锁:在进行DML操作时,oracle自动施加一个表级DDL锁;在进行单纯的DDL操作时,oracle也会在表上施加DDL锁。
3、内部锁:保护诸如表空间、数据文件、撤销段这样的结构的访问
4、闩:保护SGA中的共享数据结构的内部机制
5、数据字典锁:oracle在字典对象被修改时使用的锁
6、分布锁:分布式数据库系统或者RAC中使用的特殊锁定机制
五、显示锁
用户可以根据需要显示施加锁,如:lock table table_name in lock_mode mode [nowait]
--lock_mode的取值有:share、exclusive、row share、row exclusive、share row exclusive、share update
也可以使用select .... from table_name for update [nowait];
六、阻塞锁
一个事务持有其他事务请求的锁,就出现了阻塞锁。
使用视图v$session查询阻塞关系:
select username,sid,serial#,blocking_session from v$session --block_session表示阻塞锁持有者的会话id
where blocking_session_status='VALID';
也可以使用v$session和dba_blockers连接查询阻塞锁持有者的信息 如:
select .... from v$session s,dba_blockers b
where s.sid=b.helding_session;
还可以dba_waiters,dba_locks,v$lock等查看锁的情况。
杀死阻塞会话:1、查询阻塞锁持有者的sid,serial#
2、alter system kill session 'sid,serial#';
七、死锁
两个事务相互请求对象持有的锁,这是就发生了死锁。oracle自动解决死锁,杀死持有最近应用的锁的会话,终止其事务。
八、oracle锁管理
1、执行$oracle_home/rdbms/admin下的catblock.sql和utllockt.sql
catblock.sql创建与有关的视图 如:dba_waiters,dba_blockers,dba_locks等
utllocks.sql创建一个树形结构的锁等待图,通过执行该脚本文件可以看到会话之间的阻塞关系
2、使用oem管理所