oracle经常死锁,锁定数据库的一些表,导致oracle死锁的原因一般有那些

oracle经常死锁,锁定数据库的一些表,导致oracle死锁的原因一般有那些,第1张

一般情况只发生锁超时,就是一个进程需要访问数据库表或者字段的时候,另外一个程序正在执行带锁的访问(比如修改数据),那么这个进程就会等待,当等了很久锁还没有解除的话就会锁超时,报告一个系统错误,拒绝执行相应的SQL *** 作。发生死锁的情况比较少,比如一个进程需要访问两个资源(数据库表或者字段),当获取一个资源的时候进程就对它执行锁定,然后等待下一个资源空闲,这时候如果另外一个进程也需要两个资源,而已经获得并锁定了第二个资源,那么就会死锁,因为当前进程锁定第一个资源等待第二个资源,而另外一个进程锁定了第二个资源等待第一个资源,两个进程都永远得不到满足。

erp100com

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重新分析编译此语句。

首先你要知道表锁住了是不是正常锁?因为任何DML语句都会对表加锁。

你要先查一下是那个会话那个sql锁住了表,有可能这是正常业务需求,不建议随便KILL

session,如果这个锁表是正常业务你把session

kill掉了会影响业务的。

建议先查原因再做决定。

(1)锁表查询的代码有以下的形式:

select

count()

from

v$locked_object;

select

from

v$locked_object;

(2)查看哪个表被锁

select

bowner,bobject_name,asession_id,alocked_mode

from

v$locked_object

a,dba_objects

b

where

bobject_id

=

aobject_id;

(3)查看是哪个session引起的

select

busername,bsid,bserial#,logon_time

from

v$locked_object

a,v$session

b

where

asession_id

=

bsid

order

by

blogon_time;

(4)查看是哪个sql引起的

select

busername,bsid,bserial#,c

from

v$locked_object

a,v$session

b,v$sql

c

where

asession_id

=

bsid

and

bSQL_ID

=

csql_id

and

csql_id

=

''

order

by

blogon_time;

(5)杀掉对应进程

执行命令:alter

system

kill

session'1025,41';

其中1025为sid,41为serial#

以上就是关于oracle经常死锁,锁定数据库的一些表,导致oracle死锁的原因一般有那些全部的内容,包括:oracle经常死锁,锁定数据库的一些表,导致oracle死锁的原因一般有那些、oracle数据库的表什么情况下会被锁住、oracle数据库表被锁了不能 *** 作怎么办等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/sjk/9531719.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-29
下一篇 2023-04-29

发表评论

登录后才能评论

评论列表(0条)

保存