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; ---这种方法是设置系统或会话的锁定时间