根据保护的数据不同,ORACLE的数据库锁分为以下几大类:
1.DML锁(data locks数据锁),用于保护数据的完整性;
2.DDL锁(dictionary locks字典锁),用于保护数据库对象的结构,例如表、索引的结构定义;
3.内部锁或闩(internal locks or latches),用于保护内部结构
在 Oracle 数据库中,DML锁主要包括 TM 锁和 TX 锁,其中 TM 锁称为表级锁,TX 锁称为事务锁或行级锁。
当 Oracle 执行 DML 语句时,系统自动在所要操作的表上申请 TM 类型的锁。当 TM 锁获得后,系统再自动申请 TX 类型的锁,并将实际锁定的数据行的锁标志位进行置位。这样在事务加锁前检查 TX 锁相容性时就不用再逐行检查锁标志,而只需检查 TM 锁模式的相容性即可,大大提高了系统的效率。TM 锁包括了 SS、SX、S、X 等多种模式,在数据库中用 0-6 来表示。不同的 SQL 操作产生不同类型的 TM 锁。
在数据行上只有 X 锁(排他锁)。在 Oracle 数据库中,当一个事务首次发起一个 DML 语句时就获得一个 TX 锁,该锁保持到事务被提交或回滚。当两个或多个会话在表的同一条记录上执行 DML 语句时,第一个会话在该条记录上加锁,其他的会话处于等待状态。当第一个会话提交后,TX 锁被释放,其他会话才可以加锁。
当 Oracle 数据库发生 TX 锁等待时,如果不及时处理常常会引起 Oracle 数据库挂起,或导致死锁的发生,产生 ORA-60 的错误。这些现象都会对实际应用产生极大的危害,如长时间未响应,大量事务失败等。
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**
上面提到 TX 锁也称事务锁或者行级锁,是控制数据库并发访问的一项重要技术,也是数据完整性和一致性的重要保证。下面就一起看看如何快速查杀锁。
方案 1
1 | csharp复制代码--行锁查看 |
通过上方 SQL 可定位锁以及查杀语句,但无法确定锁源头,可通过如下 SQL 查到 SID 定位锁源头信息,如查出的锁源头(SID 位于最左边)在上边结果集中出现,则可使用上面 SQL 直接查杀锁,方便快速。
1 | sql复制代码set linesize 132 |
方案 2
使用 v$session 中的 final_blocking_instance 和 final_blocking_session 定位锁源头,具体 SQL 如下:
1 | sql复制代码SQL> select 'alter system kill session ''' || ss.sid || '' || ',' || ss.serial# || ',@' || |
最后在分享一些通用的杀会话的 SQL 脚本:
1 | python复制代码1、kill某个等待事件对应的spid: |
本文转载自: 掘金