网站首页 > 技术文章 正文
概述
我们平时碰到系统因为各种各样的锁导致进程一直不释放,常见的办法都是杀掉会话释放锁,抽空看了下这块,锁有多少种模式呢,今天主要介绍这块。
ORACLE里锁有以下几种模式:
0:none
1:null 空
2:Row-S 行共享(RS):共享表锁
3:Row-X 行专用(RX):用于行的修改
4:Share 共享锁(S):阻止其他DML操作
5:S/Row-X 共享行专用(SRX):阻止其他事务操作
6:exclusive 专用(X):独立访问使用
数字越大锁级别越高, 影响的操作越多。
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错误。
ORA-00054: resource busy and acquire with NOWAIT specified
(ORA-00054: 资源正忙, 但指定以 NOWAIT 方式获取资源)
5级锁有:Lock Share Row Exclusive
具体来讲有主外键约束时update / delete ... ; 可能会产生4,5的锁。
当对父表进行修改时,若子表对应的记录存在,则产生ORA-02292
异常;否则只对父表加TX锁和RX锁;
当对子表进行修改时,则除了对子表加加TX锁和RX锁外;对父表
也加了加SS锁,这符合逻辑,因为父表此时必须满足参考完整性;
也就是,对父表加SS锁,避免此时对父表进行修改操作。
上面锁说的修改,都是对子父表存在参考完整性的字段操作的。
6级锁有:Alter table, Drop table, Drop Index, Truncate table, Lock Exclusive
查看锁常用命令
1、查看当前会话sid:
col owner for a12 col object_name for a30 col machine for a32 col USERNAME for a16 col OSUSER for a16 select sid from v$mystat where rownum<=1 ;
2、查看当前session情况:
select machine,username,sid,serial#,type,osuser,status from v$session;
3、查看当前数据库里锁的情况
可以用如下SQL语句:
select s.username,o.object_name,s.machine,s.sid,s.serial#,k.type from v$locked_object l,dba_objects o ,v$session s,v$lock k where l.object_id = o.object_id and l.session_id=s.sid and k.sid=s.sid;
4、释放锁
如果有长期出现的一列,可能是没有释放的锁。我们可以用下面SQL语句杀掉长期没有释放非正常的锁:
alter system kill session 'sid,serial#';
如果出现了锁的问题, 某个DML操作可能等待很久没有反应。如果利用上面的命令杀死一个进程后,进程状态被置为"killed",但是锁定的资源很长时间没有被释放,那么可以在os一级再杀死相应的进程(线程),首先执行下面的语句获得进程(线程)号:
select spid, osuser, s.program from v$session s,v$process p where s.paddr=p.addr and s.sid=#sid (#sid是上面查到的sid)
5、在OS上杀死这个进程(线程):
1)在unix上,用root身份执行命令:
#kill -9 #spid(即上面查到的spid)
2)在windows用orakill杀死线程,orakill是oracle提供的一个可执行命令,语法为:
orakill sid thread
其中:
sid:表示要杀死的进程属于的实例名
thread:是要杀掉的线程号,即上面查到的spid。
rs和rx的区别在什么地方?
Row Exclusive (RX): INSERT, UPDATE, DELETE
Row Share (RS): SELECT... FOR UPDATE
两者都是TM table lock modes held by DML transactions。还是有一点区别的,一是产生的不一样。二是rx锁后,其他transactions甚至都读不到更改后的结果。而rs对其他 transactions而言读是没有问题的,所以叫它rs。
虽然都是指在表的层面上Prevents other transactions from manually locking the table, 一个是for exclusive reading or writing,而另一个是for exclusive write access. 这也就是rs的s(share)表现的地方。
关于锁的6个模式和常用命令就介绍到这了,大家感兴趣可以深入研究下,后面会分享更多DBA方面内容,感兴趣的朋友可以关注一下~
猜你喜欢
- 2025-07-10 分布式之系统底层原理(上)(底层分布式技术)
- 2025-07-10 MySQL面试题整理:从基础到高级的全面覆盖
- 2025-07-10 MySQL从入门到实战:表设计、索引优化与高频面试解析
- 2025-07-10 Spring框架基础知识-第三节内容(spring框架用法)
- 2025-07-10 一个非教条式的TDD例子(一个非一个虫)
- 2025-07-10 SQL 开发必学:深度解析 NULL 值处理的 6 大核心规则与避坑指南
- 2025-07-10 关系型数据库设计要领(值得收藏)(关系型数据库有哪些设计范式)
- 2025-07-10 Oracle数据库中判断字段不为空?(oracle数据库中判断字段不为空的函数)
- 2024-10-17 oracle数据库设计总结|三大范式 oracle数据库设计规范
- 2024-10-17 数据库(Oracle)序列(Sequence)的基本使用
你 发表评论:
欢迎- 07-10Oracle 与 Google Cloud 携手大幅扩展多云服务
- 07-10分享收藏的 oracle 11.2.0.4各平台的下载地址
- 07-10Oracle 和 Microsoft 推出 Oracle Exadata 数据库服务
- 07-10Oracle Database@Azure 推进到南美等新区域并增加了新服务
- 07-10Oracle宣布推出 Oracle Database@AWS 的有限预览版
- 07-10Oracle与Nextcloud合作,推出主权云上的安全协作平台
- 07-10NodeRED魔改版连接MsSql、PostgreSQL、MySQL、OracleDB存储无忧
- 07-10对于企业数据云备份,“多备份”承诺的是成本更低,管理更高效#36氪开放日深圳站#
- 601℃几个Oracle空值处理函数 oracle处理null值的函数
- 593℃Oracle分析函数之Lag和Lead()使用
- 581℃0497-如何将Kerberos的CDH6.1从Oracle JDK 1.8迁移至OpenJDK 1.8
- 578℃Oracle数据库的单、多行函数 oracle执行多个sql语句
- 573℃Oracle 12c PDB迁移(一) oracle迁移到oceanbase
- 566℃【数据统计分析】详解Oracle分组函数之CUBE
- 552℃最佳实践 | 提效 47 倍,制造业生产 Oracle 迁移替换
- 547℃Oracle有哪些常见的函数? oracle中常用的函数
- 最近发表
-
- Oracle 与 Google Cloud 携手大幅扩展多云服务
- 分享收藏的 oracle 11.2.0.4各平台的下载地址
- Oracle 和 Microsoft 推出 Oracle Exadata 数据库服务
- Oracle Database@Azure 推进到南美等新区域并增加了新服务
- Oracle宣布推出 Oracle Database@AWS 的有限预览版
- Oracle与Nextcloud合作,推出主权云上的安全协作平台
- NodeRED魔改版连接MsSql、PostgreSQL、MySQL、OracleDB存储无忧
- 对于企业数据云备份,“多备份”承诺的是成本更低,管理更高效#36氪开放日深圳站#
- 解读丨《归档文件整理规则》— 电子文件元数据存储
- Data Guard跳归档恢复的实践(dataguard failover)
- 标签列表
-
- 前端设计模式 (75)
- 前端性能优化 (51)
- 前端模板 (66)
- 前端跨域 (52)
- 前端缓存 (63)
- 前端aes加密 (58)
- 前端脚手架 (56)
- 前端md5加密 (54)
- 前端路由 (61)
- 前端数组 (73)
- 前端js面试题 (50)
- 前端定时器 (59)
- 前端获取当前时间 (50)
- Oracle RAC (76)
- oracle恢复 (77)
- oracle 删除表 (52)
- oracle 用户名 (80)
- oracle 工具 (55)
- oracle 内存 (55)
- oracle 导出表 (62)
- oracle约束 (54)
- oracle 中文 (51)
- oracle链接 (54)
- oracle的函数 (57)
- 前端调试 (52)
本文暂时没有评论,来添加一个吧(●'◡'●)