数据库学习笔记2-oracle 数据库锁

开始的今天好过计划的明天 -- 献给不再年轻的自己

本文参考文档:oracle 9i 10g 编程艺术,msdn

 

关于锁,参考一下oracle 9i 10g 中的定义:锁(lock)机制用于管理共享资源的并发访问

为何需要锁:在单用户数据库中,并不需要锁。根据定义,只有一个用户修改信息。不过,如果有多个用户访问和

修改数据或数据结构,就要有一种机制来防止对同一份信息的并发修改,这一点至关重要。这正是锁定所

要做的全部工作。

锁类型

   sqlserver

锁模式

说明

共享 (S)

用于不更改或不更新数据的读取操作,如 SELECT 语句。

更新 (U)

用于可更新的资源中。 防止当多个会话在读取、锁定以及随后可能进行的资源更新时发生常见形式的死锁。

排他 (X)

用于数据修改操作,例如 INSERT、UPDATE 或 DELETE。 确保不会同时对同一资源进行多重更新。

意向

用于建立锁的层次结构。 意向锁包含三种类型:意向共享 (IS)、意向排他 (IX) 和意向排他共享 (SIX)。

架构

在执行依赖于表架构的操作时使用。 架构锁包含两种类型:架构修改 (Sch-M) 和架构稳定性 (Sch-S)。

大容量更新 (BU)

在向表进行大容量数据复制且指定了 TABLOCK 提示时使用。

键范围

当使用可序列化事务隔离级别时保护查询读取的行的范围。 确保再次运行查询时其他事务无法插入符合可序列化事务的查询的行。

   oracle

 

Oracle 把锁分为三种类型:DML 锁(数据库操纵语言,比如selectupdateinsertdelete 等),DDL(数据库定义语言,比如alertcreate 锁,内部锁和闩

 

锁模式

  锁描述

  解释

 SQL操作

0

  none

 

 

1

  NULL

  

  Select

2

  SS(Row-S)

  行级共享锁,

其他对象只能查询这些数据行

  Select for updateLock for updateLock row share

3

SX(Row-X)

 行级排它锁,

在提交前不允许做DML操作

  InsertUpdateDeleteLock row share

4

  S(Share)

  共享锁

  Create indexLock share

5

  SSX(S/Row-X)

  共享行级排它锁

  Lock share row exclusive

6

  X(Exclusive)

  排它锁

Alter tableDrop ableDrop indexTruncate table

Lock exclusive

 

 

从整体上看似乎大同小异,锁的最小粒度都是数据行,都有共享锁,排他锁等。

但是具体的实现却是天壤之别

(注:由于未找到sqlserver 的锁数据的流程,因此下面的内容只针对使用基于内存的锁管理器 -- 由于sqlserver 会发生锁升级,因此猜想sqlserver 的锁应该是基于内存管理的)

如果数据库中有一个传统的基于内存的锁管理器,在这样一个数据库中,对一行锁定的过程一般如下:

(1) 找到想锁定的那一行的地址。

(2) 在锁管理器中排队(锁管理器必须是串行化的,因为这是一个常见的内存中的结构)。

(3) 锁定列表。

(4) 搜索列表,查看别人是否已经锁定了这一行。

(5) 在列表中创建一个新的条目,表明你已经锁定了这一行。

(6) 对列表解锁。

既然已经锁定了这一行,接下来就可以修改它了。之后,在你提交修改时,必须继续这个过程,如下:

(7) 再次排队。

(8) 锁住锁的列表。

(9) 在这个列表中搜索,并释放所有的锁。

(10) 对列表解锁

oracle 是这样做的:

(1) 找到想锁定的那一行的地址。

(2) 到达那一行。

(3) 锁定这一行(如果这一行已经锁定,则等待锁住它的事务结束,除非使用了 NOWAIT 选项)。

 

在内存中管理锁,使用的锁越多,开销会越大,因此基于内存的锁管理器的锁一般都会有锁升级的机制,看一看msdn 中关于sqlserver 的锁升级是怎么说的:

     锁升级是将许多较细粒度的锁转换成数量更少的较粗粒度的锁的过程,这样可以减少系统开销,但却增加了并发争用的可能性

然后看一下oracle是怎样对待锁升级的:

    Oracle 不会升级锁,从来不会。(oracle 为何不升级锁呢?是因为锁在oracle 中不是稀有资源,使用1个锁和使用100个锁的开销是相同的,看一下书中的描述:在 Oracle 中,行级锁没有相关的开销,根本没有。不论你是有 1 个行锁,还是 1 000 000 个行锁,专用于锁定这个信息的“资源”数都是一样的。当然,与修改 1 行相比,修改 1 000 000行要做的工作肯定多得多,但是对 1 000 000 行锁定所需的资源数与对 1 行锁定所需的资源数完全相同,这是一个固定的常量【具体是为什么呢?】)

   Oracle 从来不会升级锁,但是它会执行锁转换(lock conversion)或锁提升(lock promotion

 

结论是:oracle 的锁不是稀有资源,因此不会进行锁升级

                 sqlserver 的锁是稀有资源,会进行锁升级(比如从行锁上升到表锁)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值