Oracle的五种锁

合集下载

关于锁

关于锁
mode
ID1,ID2的取值含义根据type的取值而有所不同
对于TM 锁
ID1表示被锁定表的object_id 可以和dba_objects视图关联取得具体表信息,ID2 值为0
对于TX 锁
ID1以十进制数值表示该事务所占用的回滚段号和事务槽slot number号,其组形式:
0xRRRRSSSS,RRRR=RBS/UNDO NUMBER,SSSS=SLOT NUMBER
5级锁即SRX锁
相应的sql有:Lock xxx in Share Row Exclusive mode,当有主外键约束时update
/delete ... ; 可能会产生4,5的锁。
6级锁即X锁
相应的sql有:Alter table, Drop table, Drop Index, Truncate table, Lock xxx in Exclusive
BLOCK 是否阻塞其他会话锁申请 1:阻塞 0:不阻塞
0:none
1:null 空
2:Row-S 行共享(RS):共享表锁,sub share
3:Row-X 行独占(RX):用于行的修改,sub exclusive
4:Share 共享锁(S):阻止其他DML操作,share
*
第 1 行出现错误:
ORA-00054: 资源正忙, 但指定以 NOWAIT 方式获取资源
使用share row exclusive mode锁定的时候,其他session 应该不能进行insert/update/delete/drop 等操作, 同样也不能进行select for update
在数据表上,oracle默认是共享锁,在执行dml语句的时候,oracle会先申请对象上的共享锁,防止其他会话在这个对象上做ddl语句,成功申请表上的共享锁后,再在受影响的记录上加排它所,防止其他会话对这些做修改动作。

如何处理Oracle数据库中杀不掉的锁

如何处理Oracle数据库中杀不掉的锁

如何处理Oracle数据库中杀不掉的锁本篇文章主要叙述如何处理Oracle数据库中杀不掉的锁,希望可以加深大家对于如何处理Oracle数据库中杀不掉的锁的理解,提供一种方法解决这种问题,那就是在ORACLE中杀不掉的,在OS一级再杀1、下面的语句用来查询哪些对象被锁:select object_name,machine,s.sid,s.serial#from v$locked_object l,dba_objects o ,v$session swhere l.object_id = o.object_id and l.session_id=s.sid;2、下面的语句用来杀死一个进程:alter system kill session '24,111'; (其中24,111分别是上面查询出的sid,serial#)【注】以上两步,可以通过Oracle的管理控制台来执行。

3、如果利用上面的命令杀死一个进程后,进程状态被置为"killed",但是锁定的资源很长时间没有被释放,那么可以在os一级再杀死相应的进程(线程),首先执行下面的语句获得进程(线程)号:select spid, oSUSEr, s.programfrom v$session s,v$process pwhere s.paddr=p.addr and s.sid=24 (24是上面的sid)4、在OS上杀死这个进程(线程):1)在unix上,用root身份执行命令:#kill -9 12345(即第3步查询出的spid)2)在windows(unix也适用)用orakill杀死线程,orakill是oracle提供的一个可执行命令,语法为:orakill sid thread其中:sid:表示要杀死的进程属于的实例名thread:是要杀掉的线程号,即第3步查询出的spid。

例:c:>orakill orcl 12345内容来源:/database/20161101/6483.html。

oracle锁表问题处理

oracle锁表问题处理

oracle锁表问题处理查询表的状况的对象:V$LOCK, V$LOCKED_OBJECT, V$SESSION, V$SQLAREA, V$PROCESS select * from v$locked_objectselect * from dba_objects方法:首先查看哪些表被锁住了select b.owner,b.object_name,a.session_id,a.locked_modefrom v$locked_object a,dba_objects bwhere b.object_id = a.object_id;select ername,b.sid,b.serial#,logon_timefrom v$locked_object a,v$session bwhere a.session_id = b.sid order by b.logon_time;杀进程中的会话alter system kill session 'sid,serial#';例如:alter system kill session '29,5497';查询锁表的方法:SELECT S.SID SESSION_ID, ERNAME, s.SERIAL#,DECODE(LMODE, 0, 'None', 1, 'Null', 2, 'Row-S (SS)', 3, 'Row-X (SX)', 4, 'Share', 5, 'S/Row-X (SSX)', 6, 'Exclusive',TO_CHAR(LMODE)) MODE_HELD, DECODE(REQUEST, 0, 'None', 1, 'Null', 2, 'Row-S (SS)', 3, 'Row-X (SX)', 4, 'Share', 5, 'S/Row-X (SSX)', 6, 'Exclusive',TO_CHAR(REQUEST)) MODE_REQUESTED, O.OWNER||'.'||O.OBJECT_NAME||' ('||O.OBJECT_TYPE||')',S.TYPE LOCK_TYPE, L.ID1 LOCK_ID1, L.ID2 LOCK_ID2FROM V$LOCK L, SYS.DBA_OBJECTS O, V$SESSION SWHERE L.SID = S.SID AND L.ID1 = O.OBJECT_ID ;解锁方法:ALTER SYSTEM KILL SESSION 'SID,SERIR#'0----------0--------SQL> alter system kill session '1679,2456';alter system kill session '1679,2456'*ERROR at line 1:ORA-01031: insufficient privilegesgrant execute on p_kill_user_session to rtgs_liush();操作的时候用命令:EXEC SYS.P_KILL_USER_SESSION(1679);------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------数据库锁表的分析与解决上面介绍了内存溢出的原因和处理方法,下面再介绍一下数据库锁表及阻塞的原因和处理办法。

Oracle的事务及锁

Oracle的事务及锁

1、事务的概念:事务是一个基本的逻辑单元,它作为一个整体要么全部执行要么全部不执行。

2、事务的特性:原子性:事务是处理的一个原子单位,每一个操作不可拆分,它要么全部执行成功,要么全部都不执行。

一致性:指事务完成时,必须使所有的数据在整体上不变。

隔离性:各事务之间相互隔离,此事务的执行不受其他并发事务执行的干扰。

持续性:指事务对数据库的改变应是持续存在的,不会因故障而发生丢失。

3、从功能是上划分,sql语言分为DDL、DML和DCL:3.1DDL(Data Definition Language,数据定义语言):用于定义和管理数据库中的所有对象的语言,如:create创建表空间、alter修改表空间、drop 删除表空间3.2:DML(Data manipulation Language,数据操作语言):处理数据等操作,如:insert插入数据、delete删除数据、update修改数据、select查询数据3.3:DCL(Data Control Language,数据控制语言):授予或回收访问数据库的权限,控制数据库操作事务发生的时间及效果,对数据库实行监视,如:grant授权,rollback回滚,commit提交4、事务的开始及结束:一个事务可以由一条DDL语句单独组成或多条DML语句共同组成。

一个事务从执行第一条sql语句开始,在它被提交或被回滚时结束。

事务的提交可以是显式提交:用commit命令直接完成;也可以是提交隐式提交:用sql语句间接完成提交,这些语句有:alter,audit,comment,create,disconnect,drop,exit,grant,noaudit,quit,revoke,rename,会话终止等;还可以是自动提交:set autocommit on或set autocommit immediate设置为自动提交,则在插入、删除、修改语句执行后自动提交,使用set autocommit off可以取消自动提交,show autocommit可以查看自动提交是否打开。

ORACLEFORUPDATE与FORUPDATEOF区别

ORACLEFORUPDATE与FORUPDATEOF区别

ORACLEFORUPDATE与FORUPDATEOF区别在⽣产数据库中,我们为了保证数据读、写的唯⼀性,经常会碰到下⾯五种锁语句,区别在那?下⾯我们⽤实例说明⼀下:1、FOR UPDATE2、FOR UPDATE OF COLUMN3、FOR UPDATE WAIT4、FOR UPDATE NOTWAIT5、FOR UPDATE NO WAIT SKIP LOCK下⾯先来看看⼏个例⼦:1、SELECT * FROM EMP FOR UPDATE ; --锁定表的所有⾏,只能读不能写1declare2cursor emp_cur3is4select*from emp for update ; --锁定所有的⾏,只能读不能写5begin6for x in emp_cur loop7update emp set sal =9999where current of emp_cur ;8end loop ;9end ;2、SELECT * FROM EMP WHERE DEPTNO = 10 FOR UPDATE ; --只锁定DEPTNO = 10 的⾏1declare2cursor emp_cur3is4SELECT*FROM EMP WHERE DEPTNO =10FOR UPDATE ; --只锁定DEPTNO = 10 的⾏5begin6for x in emp_cur loop7update emp set sal =9999where current of emp_cur ;8end loop ;9end ;3、SELECT * FROM EMP E , DEPT D WHERE E.DEPTNO = D.DEPTNO FOR UPDATE --锁定两个表的所有记录4、SELECT * FROM EMP E , DEPT D WHERE E.DEPTNO = D.DEPTNO AND E.DEPTNO = 10 FOR UPDATE ; -- 锁定两个表中满⾜条件的⾏5、SELECT * FROM EMP E , DEPT D WHERE E.DEPTNO = D.DEPTNO AND E.DEPTNO = 10 FOR UPDATE OF E.DEPTNO ; --只会锁定EMP表中满⾜条件的⾏可以看出来FOR UPDATE是把所有的表都锁定,⽽FOR UPDATE OF 是根据OF后⾯的条件锁定相应的表第⼀点:对于⽽⾔,FOR UPDATE 和 FOR UPDATE OF 是。

oracle数据库sys密码规则

oracle数据库sys密码规则

在深入讨论oracle数据库sys密码规则之前,让我们首先简要了解一下oracle数据库的概念和特点。

Oracle数据库是一种关系型数据库管理系统,它是由Oracle公司开发的,被广泛应用于企业级应用程序和数据管理。

作为一种重要的数据库系统,它有着丰富的功能和强大的性能,同时也有着严格的安全性要求,其中包括了sys密码规则。

对于许多用户和管理员来说,数据库的安全性是至关重要的,因为数据库中往往包含着重要的企业数据和敏感信息,因此必须要有一套严格的密码规则来保护这些数据。

在oracle数据库中,sys用户是具有最高权限的用户,它可以进行各种管理和控制操作,因此sys用户的密码规则显得尤为重要。

下面,我们就来一起深入探讨一下oracle数据库sys密码规则。

1. 密码长度:在oracle数据库中,sys用户的密码长度通常要求至少包含8个字符,这是为了确保密码的复杂度和安全性。

为了进一步提高安全性,密码的长度还可以设置得更长一些,以增加密码的复杂度和难度。

2. 复杂度要求:除了密码的长度外,oracle数据库还要求密码必须包含大小写字母、数字和特殊字符等多种元素,以增加密码的复杂度和难度,从而提高密码的安全性。

3. 密码历史:为了防止用户频繁地更改密码来规避安全控制,oracle 数据库通常会要求密码历史,即要求用户不能在一段时间内重复使用之前的若干个密码。

4. 密码有效期:为了增加密码的安全性,oracle数据库通常会要求密码定期更改,即要求用户在一定的时间内必须更改密码,以确保密码的安全性。

5. 锁定策略:当用户多次输入错误密码时,oracle数据库还会对用户进行锁定,以防止恶意破解密码的行为,从而进一步提高密码的安全性。

总结回顾:sys密码规则在oracle数据库中具有非常重要的意义,它是保护数据库安全的重要措施之一。

通过设置复杂的sys密码规则,可以有效地提高数据库的安全性,避免未经授权的访问和恶意破解。

oracle必问的面试题

oracle必问的面试题

oracle必问的面试题在面试过程中,许多公司都倾向于针对Oracle数据库进行提问。

作为一种常见的数据库管理系统,Oracle在企业级应用中扮演着重要的角色。

因此,掌握Oracle的相关知识对于求职者来说非常必要。

本文将介绍一些必问的Oracle面试题,帮助读者准备面试。

1. 什么是Oracle数据库?Oracle是一种关系型数据库管理系统(RDBMS),由Oracle公司开发。

它通过使用结构化查询语言(SQL)进行数据管理和查询。

Oracle数据库广泛应用于企业级应用,包括金融、制造、电信等领域。

2. 介绍一下Oracle数据库的体系结构。

Oracle数据库的体系结构由多个组件组成,包括实例、数据库和存储。

实例是内存结构和后台进程的组合,用于管理数据库。

数据库是存储数据的物理文件集合。

存储是用于存储和检索数据的物理设备,如硬盘。

3. 什么是表空间和数据文件?表空间是Oracle数据库中逻辑存储单位,用于存储表、索引和其他对象。

每个表空间由一个或多个数据文件组成。

数据文件是物理文件,用于在磁盘上存储数据。

4. 如何创建用户和授权?使用CREATE USER语句可以创建用户,语法如下:CREATE USER username IDENTIFIED BY password;要授予用户权限,可以使用GRANT语句,语法如下:GRANT privilege1, privilege2, ... ON object_name TO username;5. 介绍一下Oracle的锁机制。

Oracle使用各种锁来实现并发控制。

共享锁(Shared Lock)用于读取数据,排他锁(Exclusive Lock)用于修改数据。

Oracle还支持行级锁和表级锁,以及乐观锁和悲观锁等不同类型的锁机制。

6. 如何备份和恢复Oracle数据库?可以使用Oracle提供的工具来备份和恢复数据库,例如使用RMAN(Recovery Manager)进行备份和恢复操作。

oracle锁原理

oracle锁原理

Oracle锁原理详解1. 概述在Oracle数据库中,锁是用于控制并发访问的一种机制。

当多个用户同时访问数据库时,为了保证数据的一致性和完整性,Oracle会对数据进行加锁,以防止其他用户对数据的修改。

本文将详细介绍Oracle锁的基本原理。

2. 锁的类型Oracle中的锁可以分为两种类型:共享锁(Shared Lock)和排他锁(Exclusive Lock)。

•共享锁:多个事务可以同时获取共享锁,并且可以并发读取数据,但不能修改数据。

共享锁用于保证数据的一致性,即多个事务可以同时读取相同的数据,但不能同时修改数据。

•排他锁:只有一个事务可以获取排他锁,并且其他事务不能同时获取共享锁或排他锁。

排他锁用于保证数据的完整性,即一个事务在修改数据时,其他事务不能同时读取或修改数据。

3. 锁的级别Oracle中的锁可以分为多个级别,包括表级锁、行级锁和字段级锁。

•表级锁:锁定整个表,阻止其他事务对表的修改。

表级锁对于大型表来说,可能会导致性能问题,因为它会阻塞其他事务的访问。

•行级锁:锁定表中的一行数据,其他事务可以并发读取其他行的数据。

行级锁可以更细粒度地控制并发访问,但可能会导致死锁问题。

•字段级锁:锁定表中的一个或多个字段,其他事务可以并发读取或修改其他字段的数据。

字段级锁可以进一步细化锁的粒度,但也可能导致死锁问题。

4. 锁的控制Oracle中的锁由数据库管理系统(DBMS)自动控制,用户无需手动操作。

当一个事务对数据进行修改时,DBMS会自动为该数据加上相应的锁,并在事务提交或回滚后释放锁。

锁的控制是通过锁定机制和并发控制机制实现的。

•锁定机制:当一个事务对数据进行修改时,DBMS会自动为该数据加上相应的锁。

锁定机制可以保证在并发访问时,每个事务都能正确地读取和修改数据。

•并发控制机制:当多个事务同时访问数据库时,DBMS会根据事务的隔离级别来控制并发访问。

并发控制机制可以避免脏读、不可重复读和幻读等问题。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Oracle的五种Table Lock
Oracle中的锁定可以分为几类:DML lock(data lock),DDL lock(dictionary lock)和internal lock/latch。

DML lock又可以分为row lock和table lock。

row lock在select.. for update/insert/update/delete时隐式自动产生,而table lock除了隐式产生,也可以调用lock table in name来显示锁定。

如果不希望别的session lock/insert/update/delete表中任意一行,只允许查询,可以用lock table table_name in exclusive mode。

(X)这个锁定模式级别最高,并发度最小。

如果允许别的session查询或用select for update锁定记录,不允许insert/update/delete,可以用lock table table_name in share row exclusive mode。

(SRX)
如果允许别的session查询或select for update以及lock table table_name in share mode,只是不允许insert/update/delete,可以用lock table table_name in share mode。

(share mode和share row exclusive mode的区别在于一个是非抢占式的而另一个是抢占式的。

进入share row exclusive mode后其他session不能阻止你insert/update/delete,而进入share mode后其他session也同样可以进入share mode,进而阻止你对表的修改。

(S)
还有两种锁定模式,row share(RS)和row exclusive(RX)。

他们允许的并发操作更多,一般直接用DML语句自动获得,而不用lock语句。

ORACLE里锁有以下几种模式:
0:none
1:null 空
2:Row-S 行共享(RS):共享表锁,sub share
3:Row-X 行独占(RX):用于行的修改,sub exclusive
4:Share 共享锁(S):阻止其他DML操作,share
5:S/Row-X 共享行独占(SRX):阻止其他事务操作,share/sub exclusive
6:exclusive 独占(X):独立访问使用,exclusive
数字越大锁级别越高, 影响的操作越多。

1级锁有:Select,有时会在v$locked_object出现。

2级锁有:Select for update,Lock For Update,Lock Row Share
select for update当对话使用for update子串打开一个游标时,所有返回集中的数据行都将处于行级(Row-X)独占式锁定,其他对象只能查询这些数据行,不能进行update、delete 或select for update操作。

3级锁有:Insert, Update, Delete, Lock Row Exclusive
没有commit之前插入同样的一条记录会没有反应, 因为后一个3的锁会一直等待上一个3的锁, 我们必须释放掉上一个才能继续工作。

4级锁有:Create Index, Lock Share
locked_mode为2,3,4不影响DML(insert,delete,update,select)操作, 但DDL(alter,drop等)操作会提示ora-00054错误。

00054, 00000, "resource busy and acquire with NOWAIT specified "
// *Cause: Resource interested is busy.
// *Action: Retry if necessary.
5级锁有:Lock Share Row Exclusive
具体来讲有主外键约束时update / delete ... ; 可能会产生4,5的锁。

6级锁有:Alter table, Drop table, Drop Index, Truncate table, Lock Exclusive
以DBA角色, 查看当前数据库里锁的情况可以用如下SQL语句:
col owner for a12
col object_name for a16
select b.owner,b.object_name,l.session_id,l.locked_mode
from v$locked_object l, dba_objects b
where b.object_id=l.object_id
/
select ername,t2.sid,t2.serial#,t2.logon_time
from v$locked_object t1,v$session t2
where t1.session_id=t2.sid order by t2.logon_time
/
如果有长期出现的一列,可能是没有释放的锁。

我们可以用下面SQL语句杀掉长期没有释放非正常的锁:
alter system kill session 'sid,serial# ';
如果出现了锁的问题, 某个DML操作可能等待很久没有反应。

当你采用的是直接连接数据库的方式,也不要用OS系统命令$kill process_num 或者$kill -9 process_num。

相关文档
最新文档