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

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

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

erp100com

数据库是一个多用户使用的共享资源。当多个用户并发地存取数据时,在数据库中就会产生多个事务同时存取同一数据的情况。若对并发 *** 作不加控制就可能会读取和存储不正确的数据,破坏数据库的一致性。

加锁是实现数据库并发控制的一个非常重要的技术。当事务在对某个数据对象进行 *** 作前,先向系统发出请求,对其加锁。加锁后事务就对该数据对象有了一定的控制,在该事务释放锁之前,其他的事务不能对此数据对象进行更新 *** 作。

在数据库中有两种基本的锁类型:排它锁(Exclusive Locks,即X锁)和共享锁(Share Locks,即S锁)。当数据对象被加上排它锁时,其他的事务不能对它读取和修改。加了共享锁的数据对象可以被其他事务读取,但不能修改。数据库利用这两种基本的锁类型来对数据库的事务进行并发控制。

根据保护的对象不同,Oracle数据库锁可以分为以下几大类:

DML锁(data locks,数据锁),用于保护数据的完整性;

DDL锁(dictionary locks,字典锁),用于保护数据库对象的结构,如表、索引等的结构定义;

内部锁和闩(internal locks and latches),保护数据库的内部结构,应用于SGA;

在我们实际应用开发中涉及较多的是DML锁,其他两种的话DBA会更加关心点;

DML锁的目的在于保证并发情况下的数据完整性,主要包括TM锁和TX锁,其中TM锁称为表级锁,TX锁称为事务锁或行级锁。

当Oracle执行DML语句时,系统自动在所要 *** 作的表上申请TM类型的锁。当TM锁获得后,系统再自动申请TX类型的锁,并将实际锁定的数据行的锁标志位进行置位。这样在事务加锁前检查TX锁相容性时就不用再逐行检查锁标志,而只需检查TM锁模式的相容性即可,大大提高了系统的效率。TM锁包括了SS、SX、S、X等多种模式,在数据库中用0-6来表示。不同的SQL *** 作产生不同类型的TM锁。如下图所示:

值 锁模式 锁描述 SQL

0 NONE

1 NULL 空 SELECT

2 SS(ROW-S) 行级共享锁

其他对象只能查询这些数据行 SELECT FOR UPDATE、LOCK FOR UPDATE、

LOCK ROW SHARE

3 SX(ROW-X) 行级排它锁

在提交前不允许做DML *** 作 INSERT、UPDATE、DELETE、

LOCK ROW SHARE

4 S(SHARE) 共享锁 CREATE INDEX、LOCK SHARE

5 SSX(S/ROW-X) 共享行级排它锁 LOCK SHARE ROW EXCLUSIVE

6 X(eXclusive) 排它锁 ALTER TABLE、DROP TABLE、DROP INDEX、

TRUNCATE TABLE、LOCK EXCLUSIVE

在数据行上只有X锁(排他锁)。在 Oracle数据库中,当一个事务首次发起一个DML语句时就获得一个TX锁,该锁保持到事务被提交或回滚。当两个或多个会话在表的同一条记录上执行 DML语句时,第一个会话在该条记录上加锁,其他的会话处于等待状态。当第一个会话提交后,TX锁被释放,其他会话才可以加锁。

在大概了解oracle的锁机制之后,我们来解决几个基本的问题:

1UPDATE/DELETE *** 作会将RS锁定,直至 *** 作被COMMIT或者ROLLBACK;

若 *** 作未COMMIT之前其他session对同样的RS做变更 *** 作,则 *** 作会被hold,直至前session的UPDATE/DELETE *** 作被COMMIT;

2session内外SELECT的RS范围

前提:INSERT、UPDATE *** 作未COMMIT之前进行SELECT;

若在同一session内,SELECT出来的RS会包括之前INSERT、UPDATE影响的记录;

若不在同一session内,SELECT出来的RS不会包括未被COMMIT的记录;

3SELECT FOR UPDATE [OF cols] [NOWAIT/WAIT] [SKIP LOCKED]

OF cols:只锁定指定字段所在表的RS,而没有指定的表则不会锁定,只会在多表联合查询时出现;

NOWAIT:语句不会hold,而是直接返回错误ORA-00054: resource busy and acquire with NOWAIT specified;

WAIT N:语句被hold N秒,之后返回错误ORA-30006: resource busy; acquire with WAIT timeout expired;

SKIP LOCKED:不提示错误,而是直接返回no rows selected;

以上几个选项可以联合使用的,比较推荐的有:

SELECT FOR UPDATE NOWAIT:对同一RS执行该SQL时,直接返回错误;

SELECT FOR UPDATE NOWAIT SKIP LOCKED:对同一RS执行该SQL时,直接返回空行;

PS:当RS被LOCK住之后,只对同样请求LOCK的语句有效,对无需LOCK的SELECT语句并没有任何影响;

sys 口令是在存放在口令文件中的,一般在数据库服务器上采用 *** 作系统验证。sys口令遗忘可以采用 手工重建口令文件方式。

重建命令:

orapwd file=$ORACLE_HOME/dbs/orapw{ORACLE_SID}ora passwd=

比如ORACLE_SID 是orcl,想设置sys口令 oracle

$ orapwd file=$ORACLE_HOME/dbs/orapworclora passwd=oracle

system用户口令修改可以通过sys( *** 作系统验证,不需要sys用户密码)进入到SQLPLUS修改。

$ sqlplus / as sysdba

SQL> alter user system identified by ;

以上就是关于oracle经常死锁,锁定数据库的一些表,导致oracle死锁的原因一般有那些全部的内容,包括:oracle经常死锁,锁定数据库的一些表,导致oracle死锁的原因一般有那些、oracle记录被另一个用户锁住怎么办、ORACLE数据库忘记SYS和SYSTEM密码,SYSTEM被锁定怎么办等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

原文地址:https://54852.com/sjk/9813118.html

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

发表评论

登录后才能评论

评论列表(0条)

    保存