数据库操作语句的分类

  • DDL:数据库模式定义语言,关键字:create
  • DML:数据操纵语言,关键字:Insert、delete、update
  • DCL:数据库控制语言 ,关键字:grant、remove
  • DQL:数据库查询语言,关键字:select

oracle表在什么情况下会被锁住

DML锁又可以分为,行锁、表锁、死锁

  • 行锁:当事务执行数据库插入、更新、删除操作时,该事务自动获得操作表中操作行的排它锁。

  • 表级锁:当事务获得行锁后,此事务也将自动获得该行的表锁(共享锁),以防止其它事务进行DDL语句影响记录行的更新。事务也可以在进行过程中获得共享锁或排它锁,只有当事务显示使用LOCK TABLE语句显示的定义一个排它锁时,事务才会获得表上的排它锁,也可使用LOCK TABLE显示的定义一个表级的共享锁(LOCK TABLE具体用法请参考相关文档)。

  • 死锁:当两个事务需要一组有冲突的锁,而不能将事务继续下去的话,就出现死锁。 
    如事务1在表A行记录#3中有一排它锁,并等待事务2在表A中记录#4中排它锁的释放,而事务2在表A记录行#4中有一排它锁,并等待事务1在表A中记录#3中排它锁的释放,事务1与事务2彼此等待,因此就造成了死锁。死锁一般是因拙劣的事务设计而产生。 
    死锁只能使用SQL下:alter system kill session “sid,serial#”;或者使用相关操作系统kill进程的命令,如UNIX下kill -9 sid,或者使用其它工具杀掉死锁进程。

DDL锁又可以分为:排它DDL锁、共享DDL锁、分析锁

  • 排它DDL锁:创建、修改、删除一个数据库对象的DDL语句获得操作对象的 排它锁。如使用alter table语句时,为了维护数据的完成性、一致性、合法性,该事务获得一排它DDL锁。

  • 共享DDL锁:需在数据库对象之间建立相互依赖关系的DDL语句通常需共享获得DDL锁。 
    如创建一个包,该包中的过程与函数引用了不同的数据库表,当编译此包时,该事务就获得了引用表的共享DDL锁。

  • 分析锁:ORACLE使用共享池存储分析与优化过的SQL语句及PL/SQL程序,使运行相同语句的应用速度更快。一个在共享池中缓存的对象获得它所引用数据库对象的分析锁。分析锁是一种独特的DDL锁类型,ORACLE使用它追踪共享池对象及它所引用数据库对象之间的依赖关系。当一个事务修改或删除了共享池持有分析锁的数据库对象时,ORACLE使共享池中的对象作废,下次在引用这条SQL/PLSQL语句时,ORACLE重新分析编译此语句。

Oracle锁表查询和解锁

就由解决以下问题来说明:

在进行批量对DML操作时程序竟然中断了,不再往下执行、查询一下某张表被锁住了,因此不再往下执行了。

第一步:通过管理员权限用户查询被锁表信息

如果怀疑表被锁了,或者事务未被正常关闭,在Oracle数据库中我们可以通过以下语句进行查询获取相关信息:

select t2.username,t2.sid,t2.serial#,t3.object_name,t2.OSUSER,t2.MACHINE,t2.PROGRAM,t2.LOGON_TIME,t2.COMMAND,t2.LOCKWAIT,t2.SADDR,t2.PADDR,t2.TADDR,t2.SQL_ADDRESS,t1.LOCKED_MODEfrom v$locked_object t1, v$session t2, dba_objects t3where t1.session_id = t2.sidand t1.object_id = t3.object_idorder by t2.logon_time;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

大家发现,上面这条SQL语句用到了Oracle的两个视图和一个表,分别是v$locked_object、v$session、dba_objects: 
v$locked_object 视图中记录了所有session中的所有被锁定的对象信息。 
v$session 视图记录了所有session的相关信息。 
dba_objects 为oracle用户对象及系统对象的集合,通过关联这张表能够获取被锁定对象的详细信息。

eg:现在我通过scott用户执行DML语句(eg:select * from emp for update;或者update scott.emp set sal = '2000' where empno='7788'; )之后一直不进行提交,然后通过system用户执行上面的查询oracle中被锁表的sql语句,就会找到如下记录: 

说明: 
username:oracle用户名 
sid:进程号 
serial#:序列号 
object_name:表名 
osuser:操作系统用户名 
machine:机器名 
program:操作工具 
logon_time:登陆时间 
lockwait:表示当前这张表是否正在等待其他用户解锁这张表 
locked_mode:锁表模式(下面详细说明)

注意:这时候如果通过system用户执行select * from scott.emp for update;语句就无法成功执行。

第二步:通过拥有管理员权限的用户解除数据库中被锁住的表(SID,SERIAL)

通过第一步查出来的信息找到被锁的表之后执行如下语句解锁该表:

alter system kill session 'sid,seial#';
  • 1

注意:sid和seial#就是第一步中查询出来的进程号和序列号。

eg:解除第一步中表的锁

alter system kill session '10,15';
  • 1

现在通过system再次执行DML语句(eg:select * from scott.emp for update;或update scott.emp set sal = '2000' where empno='7788';)就可以了。

锁的模式

v$locked_object中的LOCKED_MODE字段表示锁的模式,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

还有一条比较实用的sql:

--查某session 正在执行的sql语句,从而可以快速定位到哪些操作或者代码导致事务一直进行没有结束等.
SELECT /*+ ORDERED */ sql_textFROM v$sqltext aWHERE (a.hash_value, a.address) IN(SELECT DECODE(sql_hash_value, 0, prev_hash_value, sql_hash_value),DECODE(sql_hash_value, 0, prev_sql_addr, sql_address)FROM v$session bWHERE b.sid = '67')  /* 此处67 为SID*/ORDER BY piece ASC;

oracle 锁表查询和解表操作相关推荐

  1. mysql锁表查询和解锁操作

    mysql锁表查询和解锁操作 1.在做数据库操作时,有时会因为自己的粗心或者程序设计上的缺陷导致锁表,在mysql中查看锁表和解锁的步骤如下: //1.查看当前数据库锁表的情况SELECT * FRO ...

  2. Oracle中如何查询一个表的所有字段名和数据类型

    Oracle中如何查询一个表的所有字段名和数据类型 查询语法 select A.COLUMN_NAME,A.DATA_TYPE from user_tab_columns A where TABLE_ ...

  3. oracle学生选课查询(学生表student、成绩表sc、课程表c)

    oracle学生选课查询--学生表student.成绩表sc.课程表c 一.创建学生表,表结构(学号,姓名,年龄,性别,系别,出生地),插入几条记录 二.创建成绩表,表结构(学号,课程号,成绩),插入 ...

  4. Oracle锁信息查询

    --Oracle锁信息查询 --查询oracle会话信息 SELECT * FROM V$SESSION T ORDER BY t."LOGON_TIME"; --查询oracle ...

  5. 数据库一对多做链接去重_数据库单表查询-多表查询

    """ 1.字段修改 alter modify alter change alter add ''|first|after alter drop 2.表关系: 一对一:外 ...

  6. day44 数据库单表查询-多表查询

    目录 复习 今日内容 单表查询 连表查询 复习 """ 1.字段修改alter modifyalter changealter add ''|first|afteralt ...

  7. 表操作,数据操作,单表查询,python操作数据库

    1.表操作 创建 create table 删除 drop table 查看表结构 desc 表/show create table 表 修改 alter table 表名 rename 新表名 al ...

  8. 数据库实验 MOOC - 数据库系统概论 - 实验操作之单表查询 多表查询

    实验一 学生表:Student(Sno,Sname,Ssex,Sage,Sdept) 课程表:Course(Cno,Cname,Cpno,Ccredit) 学生选课表:SC(Sno,Cno,Grade ...

  9. 达梦、Oracle、PostgreSQL查询全部表备注,表字段,全部字段备注,全部索引,全部字段类型

    文章目录 一 概述 二 PostgreSQL PS:最佳版本查询表英文名.表中文名.字段英文名.字段中文名.字段类型.schemaname.tableowner(此为最好版本NO1) 1 查询所有表名 ...

最新文章

  1. Powerup tinyos接口实现
  2. 把RNN植入体内,仅凭一张“薄片”,就能直接检测你有无心律异常 | Science子刊...
  3. laravel $request 多维数组取值_Laravel 运行原理分析与源码分析,底层看这篇足矣
  4. Trie树统计单词前缀
  5. 2020-12-3(详解虚拟地址如何转化为物理地址)
  6. excel 避免下拉操作
  7. 多人聊天室(Java)
  8. 数字图像处理-0.绪论
  9. 数据分析 数据科学_数据科学中的数据分析
  10. [20171220]toad plsql显示整形的bug.txt
  11. 大屏实时监控-2019年CSDN博客之星年度总评选(2019-01-20 23:30)
  12. 多云架构落地设计和实施方案【华为云分享】
  13. ROS 教程之 network:多台计算机之间网络通信(1)
  14. 设置相机的距离_讲对焦(四):相机对焦有哪些小技巧?
  15. web前端-浏览器兼容性处理大全
  16. Python中if __name__=='__main__': 理解与总结(看这篇就够了,一文扫清疑惑!)
  17. PCB板自动识别检测
  18. Android11 WAPI证书安装流程
  19. MTK刷机(ubuntu下)
  20. 基于SSM的图书借阅管理系统的分析与设计(源码+文档+PPT)

热门文章

  1. 将State/SE16.0中的dta格式数据存成excel的命令
  2. 证明:dim(Null(A))+rank(A)=0
  3. C++ 堆结构(数组实现)
  4. 教你轻松搞定RJ45网线接头
  5. 金蝶注册表服务器地址,金蝶KIS客户端修改IP连接服务器的方法
  6. CRM上线之路 走上了CRM实施顾问-第98天上班 -第21周
  7. 小米路由器4A千兆版更换5G芯片和硬件布局后出现的刷机问题
  8. 【三相潮流】基于仿射区间的,含分布式电源的配电网三相潮流算法
  9. buuctf逆向pyre
  10. 商品详情页显示商品的详细信息