Oracle数据库的锁类型

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

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

locks,字典锁),用于保护数据库对象的结构,如表、索引等的结构定义;内部锁和闩(internal locks and

latches),保护数据库的内部结构。

DML锁的目的在于保证并发情况下的数据完整性,。在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的错误。这些现象都会对实际应用产生极大的危害,如长时间未响应,大量事务失败等。

悲观封锁和乐观封锁

一、悲观封锁

锁在用户修改之前就发挥作用:

Select ..for update(nowait)

Select * from tab1 for update

用户发出这条命令之后,oracle将会对返回集中的数据建立行级封锁,以防止其他用户的修改。

如果此时其他用户对上面返回结果集的数据进行dml或ddl操作都会返回一个错误信息或发生阻塞。

1:对返回结果集进行update或delete操作会发生阻塞。

2:对该表进行ddl操作将会报:Ora-00054:resource

busy and acquire with nowait specified.

原因分析

此时Oracle已经对返回的结果集上加了排它的行级锁,所有其他对这些数据进行的修改或删除操作都必须等待这个锁的释放,产生的外在现象就是其他的操作将发生阻塞,这个这个操作commit或rollback.

同样这个查询的事务将会对该表加表级锁,不允许对该表的任何ddl操作,否则将会报出ora-00054错误::resource

busy and acquire with nowait specified.

二、乐观封锁

乐观的认为数据在select出来到update进取并提交的这段时间数据不会被更改。这里面有一种潜在的危险就是由于被选出的结果集并没有被锁定,是存在一种可能被其他用户更改的可能。因此Oracle仍然建议是用悲观封锁,因为这样会更安全。

阻塞

定义:

当一个会话保持另一个会话正在请求的资源上的锁定时,就会发生阻塞。被阻塞的会话将一直挂起,直到持有锁的会话放弃锁定的资源为止。4个常见的dml语句会产生阻塞

INSERT

UPDATE

DELETE

SELECT…FOR UPDATE

INSERT

Insert发生阻塞的唯一情况就是用户拥有一个建有主键约束的表。当2个的会话同时试图向表中插入相同的数据时,其中的一个会话将被阻塞,直到另外一个会话提交或会滚。一个会话提交时,另一个会话将收到主键重复的错误。回滚时,被阻塞的会话将继续执行。

UPDATE

和DELETE当执行Update和delete操作的数据行已经被另外的会话锁定时,将会发生阻塞,直到另一个会话提交或会滚。

Select …for update

当一个用户发出select..for

update的错作准备对返回的结果集进行修改时,如果结果集已经被另一个会话锁定,就是发生阻塞。需要等另一个会话结束之后才可继续执行。可以通过发出

select… for update

nowait的语句来避免发生阻塞,如果资源已经被另一个会话锁定,则会返回以下错误:Ora-00054:resource

busy and acquire with nowait specified.

死锁-deadlock

定义:当两个用户希望持有对方的资源时就会发生死锁.

即两个用户互相等待对方释放资源时,oracle认定为产生了死锁,在这种情况下,将以牺牲一个用户作为代价,另一个用户继续执行,牺牲的用户的事务将回滚.

例子:

1:用户1对A表进行Update,没有提交。

2:用户2对B表进行Update,没有提交。

此时双反不存在资源共享的问题。

3:如果用户2此时对A表作update,则会发生阻塞,需要等到用户一的事物结束。

4:如果此时用户1又对B表作update,则产生死锁。此时Oracle会选择其中一个用户进行会滚,使另一个用户继续执行操作。

起因:

Oracle的死锁问题实际上很少见,如果发生,基本上都是不正确的程序设计造成的,经过调整后,基本上都会避免死锁的发生。

DML锁分类表

表1 Oracle的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 able、Drop index、Truncate table

、Lock exclusive

1.关于V$lock表和相关视图的说明

Column Datatype Description

ADDR RAW(4 | 8) Address of lock state object

KADDR RAW(4 | 8) Address of lock

SID NUMBER Identifier for session holding or acquiring the

lock

TYPE VARCHAR2(2) Type of user or system lock

The locks on the user types are obtained by user applications. Any

process that is blocking others is likely to be holding one of

these locks. The user type locks are:

TM - DML enqueue

TX - Transaction enqueue

UL - User supplied

--我们主要关注TX和TM两种类型的锁

--UL锁用户自己定义的,一般很少会定义,基本不用关注

--其它均为系统锁,会很快自动释放,不用关注

ID1 NUMBER Lock identifier #1 (depends on type)

ID2 NUMBER Lock identifier #2 (depends on type)

---当lock type 为TM时,id1为DML-locked object的object_id

---当lock type 为TX时,id1为usn+slot,而id2为seq。

--当lock type为其它时,不用关注

LMODE NUMBER Lock mode in which the session holds the

lock:

0 - none

1 - null (NULL)

2 - row-S (SS)

3 - row-X (SX)

4 - share (S)

5 - S/Row-X (SSX)

6 - exclusive (X)

--大于0时表示当前会话以某种模式占有该锁,等于0时表示当前会话正在等待该锁资源,即表示该会话被阻塞。

--往往在发生TX锁时,伴随着TM锁,比如一个sid=9会话拥有一个TM锁,一般会拥有一个或几个TX锁,但他们的id1和id2是不同的,请注意

REQUEST NUMBER Lock mode in which the process requests the

lock:

0 - none

1 - null (NULL)

2 - row-S (SS)

3 - row-X (SX)

4 - share (S)

5 - S/Row-X (SSX)

6 - exclusive (X)

--大于0时,表示当前会话被阻塞,其它会话占有改锁的模式

CTIME NUMBER Time since current mode was granted

BLOCK NUMBER The lock is blocking another lock

0, 'Not Blocking',

1, 'Blocking',

2, 'Global',

--该锁是否阻塞了另外一个锁

2.其它相关视图说明

视图名 描述 主要字段说明

v$session 查询会话的信息和锁的信息。 sid,serial#:表示会话信息。

program:表示会话的应用程序信息。

row_wait_obj#:表示等待的对象,和dba_objects中的object_id相对应。

lockwait :该会话等待的锁的地址,与v$lock的kaddr对应.

v$session_wait 查询等待的会话信息。 sid:表示持有锁的会话信息。

Seconds_in_wait:表示等待持续的时间信息

Event:表示会话等待的事件,锁等于enqueue

dba_locks 对v$lock的格式化视图。

Session_id:和v$lock中的Sid对应。

Lock_type:和v$lock中的type对应。

Lock_ID1: 和v$lock中的ID1对应。

Mode_held,mode_requested:和v$lock中

的lmode,request相对应。

v$locked_object 只包含DML的锁信息,包括回滚段和会话信息。

Xidusn,xidslot,xidsqn:表示回滚段信息。和

v$transaction相关联。

Object_id:表示被锁对象标识。

Session_id:表示持有锁的会话信息。

Locked_mode:表示会话等待的锁模式的信

息,和v$lock中的lmode一致。

1.查询数据库中的锁

select * from v$lock;

select * from v$lock where block=1;

2.查询被锁的对象

select * from v$locked_object;

3.查询阻塞

查被阻塞的会话

select * from v$lock where lmode=0 and type in

('TM','TX');

查阻塞别的会话锁

select * from v$lock where lmode>0 and type in

('TM','TX');

4.查询数据库正在等待锁的进程

select * from v$session where lockwait is not

null;

5.查询会话之间锁等待的关系

select a.sid holdsid,b.sid waitsid,a.type,a.id1,a.id2,a.ctime from

v$lock a,v$lock b

where a.id1=b.id1 and a.id2=b.id2 and a.block=1 and

b.block=0;

6.查询锁等待事件

select * from v$session_wait where event='enqueue';

mysql 视图锁_Oracle数据库的锁类型及相关视图相关推荐

  1. mysql 关闭锁_mysql数据库取消锁

    {"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],&q ...

  2. Mysql学习总结(83)——常用的几种分布式锁:ZK分布式锁、Redis分布式锁、数据库分布式锁、基于JDK的分布式锁方案对比总结

    一.基于数据库实现分布式锁 1.1.悲观锁 利用select - where - for update 排他锁.注意: 其他附加功能与实现一基本一致,这里需要注意的是"where name= ...

  3. Mysql uplock 更新锁_数据库更新锁WITH UPDLOCK

    今天因为并发的问题,又讨论了一遍.之前以为同时两个线程开启,线程A加了更新锁,线程B没有加,线程A更新后,线程B也会继续下去代码.但是今天测试了一下,原来线程A更新后(解锁),线程B将不会继续,会出现 ...

  4. oracle和mysql数据类型转换_oracle数据库和MySQL数据库中表格转换时的数据类型

    下面是oracle数据库中的语句请问前辈将下面语句转换成MySQL里的语句是什么样的坐等CREATETABLE"LXA"."USERS"("U_ID& ...

  5. oracle和mysql空字符串_Oracle数据库中对null值的排序及mull与空字符串的区别

    order by排序之null值处理方法在对业务数据排序时候,发现有些字段的记录是null值,这时排序便出现了有违我们使用习惯的数据大小顺序问题.在Oracle中规定,在Order by排序时缺省认为 ...

  6. blender视图缩放_如何使用主视图类型缩放Elm视图

    blender视图缩放 A concept to help Elm Views scale as applications grow larger and more complicated. 当应用程 ...

  7. MySQL数据库的锁(什么是数据库的锁?什么是乐观锁和悲观锁?什么是死锁?如何避免?)

    数据库的锁 什么是数据库的锁? 数据库的锁与隔离级别的关系? 数据库锁的类型有哪些? MySQL中InnoDB引擎的行锁模式及其是如何实现的? 什么是数据库的乐观锁和悲观锁,如何实现? 什么是死锁?如 ...

  8. mysql三锁,mysql锁机制之表锁(三)

    顾名思义,表锁就是一锁锁一整张表,在表被锁定期间,其他事务不能对该表进行操作,必须等当前表的锁被释放后才能进行操作.表锁响应的是非索引字段,即全表扫描,全表扫描时锁定整张表,sql语句可以通过执行计划 ...

  9. 深入理解数据库行锁与表锁

    当插入数据时,就锁定表,这叫做"锁表":当更新数据时,就锁定行,这叫做"锁行". 锁在数据网络传输中是一个非常重要的概念,当多个用户对数据库进行操作时,会带来数 ...

最新文章

  1. 手机长时间不用自动断网_不用蓝牙的感应音箱,只需百元!放上手机自动播放,媲美千元音质...
  2. python turtle循环图案-Python绘图Turtle库详解
  3. idea 升级到2020后 无法启动_i.MXRT软复位后无法从32MB Flash启动?
  4. mysql blob key length_mysql – 没有密钥长度的密钥规范中使用的BLOB / TEXT列’bestilling’...
  5. 通俗理解LightGBM并图解举例
  6. js控制图像等比例缩放
  7. java中的语句有哪些_java中的循环语句有哪些
  8. Perl语言入门-第四章-子程序-习题
  9. 微商人赚钱的4个落地动作
  10. STM32 USB数据接收与数据发送程序流程分析
  11. 【C语言】10-字符和字符串常用处理函数
  12. Alibaba Cloud Linux 等保 2.0 三级版操作系统详解
  13. 教你如何写第一个jsp页面
  14. 高精度加法 problem A+B
  15. 【人脸识别】基于 Gabor+SVM和PCA+SVM实现人脸识别matlab源码含 GUI
  16. java8 .stream().anyMatch / allMatch / noneMatch用法
  17. python安全之Pickle反序列化漏洞学习。
  18. 机器学习(二)线性模型---LR
  19. vreyCD 标题中的经典名句
  20. MAC使用小技巧之用好mac电脑?的10个必知的小技巧!

热门文章

  1. Flink算子(ProcessFunction,map和Flatmap)
  2. python windows记事本_pywinauto自动化操作记事本
  3. 菜单向上拉html,模拟select控件,CSS上拉菜单
  4. thread类 java_java入门避坑必读,通过Thread类创建java多线程
  5. mysql invalid default value_mysql5.x升级到5.7 导入数据出错,提示Invalid default value for...
  6. list python 访问 键值对_学完Python,我决定熬夜整理这篇总结...
  7. Unity的Animator中Transition有延迟的问题
  8. OpenShift 4 - DevSecOps Workshop (4) - 为 Task 增加参数和Workspace
  9. OpenShift 4 Hands-on Lab (12) 使用配置参数和环境变量
  10. 设置Android AI开发环境