oracle数据库中的锁

来源:互联网 发布:最好的网络摄像头 编辑:程序博客网 时间:2024/03/29 21:48

Oracle中的锁:
锁是数据库用来控制共享资源并发访问的机制。锁用于保护正在被修改的数据直到提交或回滚了事务之后,其他用户才可以更新数据。

锁的特性:
一致性:一次只允许一个用户修改数据
完整性:为所有用户提供正确的数据。如果一个用户进行了修改并保存,所做的修改将反映给所有用户
并行性:允许多个用户访问同一数据

----------------------------------------------常见的各种锁---------------------------------------------------------------

行级锁:对正在被修改的行进行锁定,其他用户可以访问除被锁定的行以外的行。
在使用insert,delete,update,select…for upadte语句时,Oracle会自动应用行级锁。Select…for update语句允许用户一次锁定多条记录进行更新,可以限制用户等待的时间及防止无限期等待,用户必须通过commit或rollback语句释放锁。

表级锁:将整个表锁定,Lock table 表名 in share mode;


< 1> 分布式事务被锁:
select * from dba_2pc_pending;      --查询dba_2pc_pending表中state字段是否为forced commit或forced rollback,若不是则有问题
解决:
commit force '11.8.207';
commit force '9.1.26836'; 

 

<2> oracle数据库用户解锁:
  alter user yy0a account unlock;
  alter profile default limit failed_login_attempts unlimited;    ----把 YY0A 锁用户的次数修改为 unlimit

 

 <3> Oracle数据库表被锁
SELECT a.username,decode(b.type,'TM','TABLE LOCK','TX','ROW LOCK',NULL) LOCK_LEVEL, 
 c.owner,c.object_name,c.object_type, 
 a.sid,a.serial#,a.terminal,a.machine,a.program,a.osuser 
FROM v$session a,v$lock b,dba_objects c 
WHERE b.sid = a.sid 
AND b.id1 = c.object_id(+) 
AND a.username is NOT Null;               ---查询被锁的表

 

SELECT /*+ rule */
         s.username,
         decode(l.type, 'TM', 'TABLE LOCK', 'TX', 'ROW LOCK', NULL) LOCK_LEVEL,
         o.owner,
         o.object_name,
         o.object_type,
         s.sid,
         s.serial#,
         s.terminal,
         s.machine,
         s.program,
         s.osuser,
          s.sid, s.serial#,
           'alter system kill session' || '''' ||s.sid||','||s.serial#||'''' ||';'
          FROM v$session s, v$lock l, dba_objects o
         WHERE l.sid = s.sid
           AND l.id1 = o.object_id(+)
           AND s.username is NOT NULL;

解决一:

alter system kill session 'sid,serial#';

解决二:

oracle_11g才适用:
alter session set ddl_lock_timeout = 600;


alter system set ddl_lock_timeout = 600;      ---这种方法是设置系统或会话的锁定时间

0 0