精华内容
下载资源
问答
  • 数据库中的锁

    2010-10-11 11:30:00
    本文详细介绍MS SQL入门基础:数据库中的锁  11.5.1 锁的概念  锁(Lock) 是在多用户环境下对资源访问的一种限制。机制当对一个数据源加锁后,此数据源就有了一定的访问限制。我们就称对此数据源进行了...

    本文详细介绍MS SQL入门基础:数据库中的锁

      11.5.1 锁的概念

      锁(Lock) 是在多用户环境下对资源访问的一种限制。机制当对一个数据源加锁后,此数据源就有了一定的访问限制。我们就称对此数据源进行了“锁定”。在SQL Server中,可以对以下的对象进行锁定:

    数据行(Row):数据页中的单行数据; 索引行(Key):索引页中的单行数据,即索引的键值; 页(Page):页是SQL Server 存取数据的基本单位,其大小为8KB; 盘区(Extent):一个盘区由8 个连续的页组成; 表(Table); 数据库(Database)。 11.5.2 锁的类别

      在SQL Server 中,锁有两种分类方法。

      (1) 从数据库系统的角度来看

      锁分为以下三种类型:

    独占锁(Exclusive Lock)

      独占锁锁定的资源只允许进行锁定操作的程序使用,其它任何对它的操作均不会被接受。执行数据更新命令,即INSERT、 UPDATE 或DELETE 命令时,SQL Server 会自动使用独占锁。但当对象上有其它锁存在时,无法对其加独占锁。独占锁一直到事务结束才能被释放。 共享锁(Shared Lock)

      共享锁锁定的资源可以被其它用户读取,但其它用户不能修改它。在SELECT 命令执行时,SQL Server 通常会对对象进行共享锁锁定。通常加共享锁的数据页被读取完毕后,共享锁就会立即被释放。 更新锁(Update Lock)

      更新锁是为了防止死锁而设立的。当SQL Server 准备更新数据时,它首先对数据对象作更新锁锁定,这样数据将不能被修改,但可以读取。等到SQL Server 确定要进行更新数据操作时,它会自动将更新锁换为独占锁。但当对象上有其它锁存在时,无法对其作更新锁锁定。

    (2)从程序员的角度看

      锁分为以下两种类型:

    乐观锁(Optimistic Lock)

      乐观锁假定在处理数据时,不需要在应用程序的代码中做任何事情就可以直接在记录上加锁、即完全依靠数据库来管理锁的工作。一般情况下,当执行事务处理时SQL Server会自动对事务处理范围内更新到的表做锁定。 悲观锁(Pessimistic Lock)

    关键字: DataGuard checkpoint 动态查询 synonyms 卸载SQL 2005 SQL Server群集

    本文详细介绍MS SQL入门基础:数据库中的锁

      悲观锁对数据库系统的自动管理不感冒,需要程序员直接管理数据或对象上的加锁处理,并负责获取、共享和放弃正在使用的数据上的任何锁。

      11.5.3 隔离级别

      隔离(Isolation) 是计算机安全学中的一种概念,其本质上是一种封锁机制。它是指 自动数据处理系统中的用户和资源的相关牵制关系,也就是用户和进程彼此分开,且和操 作系统的保护控制也分开来。在SQL Server 中,隔离级(Isolation Level) 是指一个事务 和其它事务的隔离程度,即指定了数据库如何保护(锁定)那些当前正在被其它用户或服 务器请求使用的数据。指定事务的隔离级与在SELECT 语句中使用锁定选项来控制锁定 方式具有相同的效果。

      在SQL Server 中有以下四种隔离级:

    READ COMMITTED

      在此隔离级下,SELECT 命令不会返回尚未提交(Committed) 的数据,也不能返回脏数据。它是SQL Server 默认的隔离级。 READ UNCOMMITTED

      与READ COMMITTED 隔离级相反,它允许读取已经被其它用户修改但尚未提交确定的数据。 REPEATABLE READ

      在此隔离级下,用SELECT 命令读取的数据在整个命令执行过程中不会被更改。此选项会影响系统的效能,非必要情况最好不用此隔离级。 SERIALIZABLE

      与DELETE 语句中SERIALIZABLE 选项含义相同。隔离级需要使用SET 命令来设定其语法如下:

      SET TRANSACTION ISOLATION LEVEL

      {READ COMMITTED

      | READ UNCOMMITTED

      | REPEATABLE READ

      | SERIALIZABLE }

      11.5.4 查看锁

      可以通过企业管理器或存储过程来查看锁。

      (1) 用Enterprise Manager 查看锁

      在企业管理器中选择目录树窗口中“Management” 文件夹下,“Current Activity” 中的“Locks / Process ID” 节点,则可以查看当前锁定的进程;选择同级的“Locks / Object”节点下的相应字节点,则可以查看当前锁定的对象,如图11-1 所示。在图11-1 中,右键单击任务板窗口中的对象,从快捷菜单中选择“属性”选项,则会出现如图11-2 所示的锁的进程细节对话框。在此,可以刷新或杀死锁的进程。

    关键字: DataGuard checkpoint 动态查询 synonyms 卸载SQL 2005 SQL Server群集

    本文详细介绍MS SQL入门基础:数据库中的锁

      杀死进程还可以用如下Transact-SQL 命令来进行:

      KILL spid

      spid 是System Process ID, 即系统进程编号的缩写,如图11-1 中所示。

      

      图11-2 锁定的进程细节

      (2) 用系统存储过程Sp_lock 查看锁

      存储过程Sp_lock 的语法如下:

      sp_lock spid

      SQL Server 的进程编号spid 可以在master.dbo.sysprocesses 系统表中查到。spid 是INT类型的数据,如果不指定spid ,则显示所有的锁。

      

      11.5.5 死锁及其防止

      死锁(Deadlocking) 是在多用户或多进程状况下,为使用同一资源而产生的无法解决的争用状态,通俗地讲,就是两个用户各占用一个资源,两人都想使用对方的资源,但同时又不愿放弃自己的资源,就一直等待对方放弃资源,如果不进行外部干涉,就将一直耗下去。

      死锁会造成资源的大量浪费,甚至会使系统崩溃。在SQL Server 中解决死锁的原则是“牺牲一个比两个都死强”,即挑出一个进程作为牺牲者,将其事务回滚,并向执行此进程的程序发送编号为1205 的错误信息。而防止死锁的途径就是不能让满足死锁条件的情况发生,为此,用户需要遵循以下原则:

    尽量避免并发地执行涉及到修改数据的语句; 要求每个事务一次就将所有要使用的数据全部加锁,否则就不予执行; 预先规定一个封锁顺序所有的事务,都必须按这个顺序对数据执行封锁,例如,不同的过程在事务内部对对象的更新执行顺序应尽量保持一致; 每个事务的执行时间不可太长,对程序段长的事务可考虑将其分割为几个事务
    展开全文
  • 数据库中的锁

    2016-10-13 20:56:51
    多个用户同时对数据库的并发操作时会带来以下数据不一致问题: 1.1.1 丢失更新 A,B两个用户读同一数据并进行修改,其中一个用户修改结果破坏了另一个修改结果,比如订票系统。1.1.2 脏读 A用户修改了数据,...

    1、概述
    1.1 为什么要引入锁
    多个用户同时对数据库的并发操作时会带来以下数据不一致的问题:
    1.1.1 丢失更新
    A,B两个用户读同一数据并进行修改,其中一个用户的修改结果破坏了另一个修改的结果,比如订票系统。

    1.1.2 脏读
    A用户修改了数据,随后B用户又读出该数据,但A用户因为某些原因取消了对数据的修改,数据恢复原值,此时B得到的数据就与数据库内的数据产生了不一致。

    1.1.3 不可重复读
    A用户读取数据,随后B用户读出该数据并修改,此时A用户再读取数据时发现前后两次的值不一致。

    并发控制的主要方法是封锁。锁就是在一段时间内禁止用户做某些操作以避免产生数据不一致。

    2、锁的分类
    2.1 从数据库系统的角度划分
    从数据库系统的角度来看:分为独占锁(即排它锁),共享锁和更新锁
    2.1.1 共享 (S)
    用于不更改或不更新数据的操作(只读操作),如 SELECT 语句。
    2.1.2 更新 (U)
    用于可更新的资源中。防止当多个会话在读取、锁定以及随后可能进行的资源更新时发生常见形式的死锁。
    2.1.3 排它 (X)
    用于数据修改操作,例如 INSERT、UPDATE 或 DELETE。确保不会同时同一资源进行多重更新。

    2.2 从程序员的角度划分
    从程序员的角度看:分为乐观锁和悲观锁。
    2.2.1 悲观锁(Pessimistic Lock)
    顾名思义,就是很悲观,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会block直到它拿到锁。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。
    2.2.2 乐观锁(Optimistic Lock)
    顾名思义,就是很乐观,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号等机制。乐观锁适用于多读的应用类型,这样可以提高吞吐量,像数据库如果提供类似于write_condition机制的其实都是提供的乐观锁。
    2.2.3 比较
    两种锁各有优缺点,不可认为一种好于另一种,像乐观锁适用于写比较少的情况下,即冲突真的很少发生的时候,这样可以省去了锁的开销,加大了系统的整个吞吐量。但如果经常产生冲突,上层应用会不断的进行retry,这样反倒是降低了性能,所以这种情况下用悲观锁就比较合适。
    SQLSERVER 使用锁在多个同时在数据库内执行修改的用户间实现悲观并发控制。

    3、锁的粒度
    锁粒度是被封锁目标的大小,封锁粒度小,则并发性高,但开销大;封锁粒度大,则并发性低,但开销小。SQL Server支持的锁粒度可以分为为行、页、键、键范围、索引、表或数据库获取锁。
    (1)RID:行标识符。用于单独锁定表中的一行。
    (2)键:索引中的行锁。用于保护可串行事务中的键范围。
    (3)页:8 千字节 (KB) 的数据页或索引页。
    (4)表:包括所有数据和索引在内的整个表。

    4、锁定时间的长短
    锁保持的时间长度为保护所请求级别上的资源所需的时间长度。
    用于保护读取操作的共享锁的保持时间取决于事务隔离级别。采用 READ COMMITTED 的默认事务隔离级别时,只在读取页的期间内控制共享锁。在扫描中,直到在扫描内的下一页上获取锁时才释放锁。如果指定 HOLDLOCK 提示或者将事务隔离级别设置为 REPEATABLE READ 或 SERIALIZABLE,则直到事务结束才释放锁。

    用于保护更新的排它锁将直到事务结束才释放。如果一个连接试图获取一个锁,而该锁与另一个连接所控制的锁冲突,则试图获取锁的连接将一直阻塞到将冲突锁释放而且连接获取了所请求的锁。

    连接的超时间隔已到期。默认情况下没有超时间隔,但是一些应用程序设置超时间隔以防止无限期等待。

    5、SQL Server 中锁的自定义
    5.1 处理死锁和设置死锁优先级
    死锁就是多个用户申请不同封锁,由于申请者均拥有一部分封锁权而又等待其他用户拥有的部分封锁而引起的无休止的等待。

    可以使用SET DEADLOCK_PRIORITY控制在发生死锁情况时会话的反应方式。如果两个进程都锁定数据,并且直到其它进程释放自己的锁时,每个进程才能释放自己的锁,即发生死锁情况。

    5.2 处理超时和设置锁超时持续时间

    @@LOCK_TIMEOUT:返回当前会话的当前锁超时设置,单位为毫秒。
    SET LOCK_TIMEOUT:设置允许应用程序设置语句等待阻塞资源的最长时间。当语句等待的时间大于 LOCK_TIMEOUT 设置时,系统将自动取消阻塞的语句,并给应用程序返回”已超过了锁请求超时时段的错误信息。

    //下例将锁超时期限设置为 1,800 毫秒。
    SET LOCK_TIMEOUT 1800

    6、查看锁的信息
    (1) 执行 EXEC SP_LOCK 报告有关锁的信息
    (2)查询分析器中按Ctrl+2可以看到锁的信息

    展开全文
  • 聊一聊数据库中的锁

    2020-05-25 08:29:58
    https://www.cnblogs.com/CoderAyu/p/11375088.html 聊一聊数据库中的锁
    展开全文
  • 数据库中的锁机制   锁是网络数据库中的一个非常重要的概念,它主要用于多用户环境下保证数据库完整性和一致性。各种大型数据库所采用的锁的基本理论是一致的,但在具体实现上各有差别。目前,大多数数据库管理...

     

     

    数据库中的锁机制

     

    锁是网络数据库中的一个非常重要的概念,它主要用于多用户环境下保证数据库完整性和一致性。各种大型数据库所采用的锁的基本理论是一致的,但在具体实现上各有差别。目前,大多数数据库管理系统都或多或少具有自我调节、自我管理的功能,因此很多用户实际上不清楚锁的理论和所用数据库中锁的具体实现。

    Microsoft SQL Server(以下简称SQL Server)作为一种中小型数据库管理系统,已经得到了广泛的应用,该系统更强调由系统来管理锁。在用户有SQL请求时,系统分析请求,自动在满足锁定条件和系统性能之间为数据库加上适当的锁,同时系统在运行期间常常自动进行优化处理,实行动态加锁。对于一般的用户而言,通过系统的自动锁定管理机制基本可以满足使用要求,但如果对数据安全、数据库完整性和一致性有特殊要求,就必须自己控制数据库的锁定和解锁,这就需要了解SQL Server的锁机制,掌握数据库锁定方法。

    锁的多粒度性以及锁升级

    数据库中的锁是指一种软件机制,用来指示某个用户(也即进程会话,下同)已经占用了某种资源,从而防止其他用户做出影响本用户的数据修改或导致数据库数据的非完整性和非一致性。这儿所谓资源,主要指用户可以操作的数据行、索引以及数据表等。根据资源的不同,锁有多粒度(multigranular)的概念,也就是指可以锁定的资源的层次。SQL Server中能够锁定的资源粒度包括:数据库、表、区域、页面、键值(指带有索引的行数据)、行标识符(RID,即表中的单行数据)。

    采用多粒度锁的重要用途是用来支持并发操作和保证数据的完整性。SQL Server根据用户的请求,做出分析后自动给数据库加上合适的锁。假设某用户只操作一个表中的部分行数据,系统可能会只添加几个行锁(RID)或页面锁,这样可以尽可能多地支持多用户的并发操作。但是,如果用户事务中频繁对某个表中的多条记录操作,将导致对该表的许多记录行都加上了行级锁,数据库系统中锁的数目会急剧增加,这样就加重了系统负荷,影响系统性能。因此,在数据库系统中,一般都支持锁升级(lock escalation)。所谓锁升级是指调整锁的粒度,将多个低粒度的锁替换成少数的更高粒度的锁,以此来降低系统负荷。在SQL Server中当一个事务中的锁较多,达到锁升级门限时,系统自动将行级锁和页面锁升级为表级锁。特别值得注意的是,在SQL Server中,锁的升级门限以及锁升级是由系统自动来确定的,不需要用户设置。

    锁的模式和兼容性

    在数据库中加锁时,除了可以对不同的资源加锁,还可以使用不同程度的加锁方式,即锁有多种模式,SQL Server中锁模式包括:

    1.共享锁

    SQL Server中,共享锁用于所有的只读数据操作。共享锁是非独占的,允许多个并发事务读取其锁定的资源。默认情况下,数据被读取后,SQL Server立即释放共享锁。例如,执行查询“SELECT * FROM my_table”时,首先锁定第一页,读取之后,释放对第一页的锁定,然后锁定第二页。这样,就允许在读操作过程中,修改未被锁定的第一页。但是,事务隔离级别连接选项设置和SELECT语句中的锁定设置都可以改变SQL Server的这种默认设置。例如,“ SELECT * FROM my_table HOLDLOCK”就要求在整个查询过程中,保持对表的锁定,直到查询完成才释放锁定。

    2.修改锁

    修改锁在修改操作的初始化阶段用来锁定可能要被修改的资源,这样可以避免使用共享锁造成的死锁现象。因为使用共享锁时,修改数据的操作分为两步,首先获得一个共享锁,读取数据,然后将共享锁升级为独占锁,然后再执行修改操作。这样如果同时有两个或多个事务同时对一个事务申请了共享锁,在修改数据的时候,这些事务都要将共享锁升级为独占锁。这时,这些事务都不会释放共享锁而是一直等待对方释放,这样就造成了死锁。如果一个数据在修改前直接申请修改锁,在数据修改的时候再升级为独占锁,就可以避免死锁。修改锁与共享锁是兼容的,也就是说一个资源用共享锁锁定后,允许再用修改锁锁定。

    3.独占锁

    独占锁是为修改数据而保留的。它所锁定的资源,其他事务不能读取也不能修改。独占锁不能和其他锁兼容。

    4.结构锁

    结构锁分为结构修改锁(Sch-M)和结构稳定锁(Sch-S)。执行表定义语言操作时,SQL Server采用Sch-M锁,编译查询时,SQL Server采用Sch-S锁。

    5.意向锁

    意向锁说明SQL Server有在资源的低层获得共享锁或独占锁的意向。例如,表级的共享意向锁说明事务意图将独占锁释放到表中的页或者行。意向锁又可以分为共享意向锁、独占意向锁和共享式独占意向锁。共享意向锁说明事务意图在共享意向锁所锁定的低层资源上放置共享锁来读取数据。独占意向锁说明事务意图在共享意向锁所锁定的低层资源上放置独占锁来修改数据。共享式独占锁说明事务允许其他事务使用共享锁来读取顶层资源,并意图在该资源低层上放置独占锁。

    6.批量修改锁

    批量复制数据时使用批量修改锁。可以通过表的TabLock提示或者使用系统存储过程sp_tableoption的“table lock on bulk load”选项设定批量修改锁。

    另外,SQL Server命令语句操作会影响锁定的方式,语句的组合也同样能产生不同的锁定,详情如下表:

    锁冲突及其防止办法

    在数据库系统中,死锁是指多个用户(进程)分别锁定了一个资源,并又试图请求锁定对方已经锁定的资源,这就产生了一个锁定请求环,导致多个用户(进程)都处于等待对方释放所锁定资源的状态。

    在SQL Server中,系统能够自动定期搜索和处理死锁问题。系统在每次搜索中标识所有等待锁定请求的进程会话,如果在下一次搜索中该被标识的进程仍处于等待状态,SQL Server就开始递归死锁搜索

     

     

    展开全文
  • Oracle数据库中的锁

    千次阅读 2019-04-07 23:07:11
    数据库锁 ...在数据库中有两种基本的锁类型:排它锁(Exclusive Locks,即X锁)和共享锁(Share Locks,即S锁)。当数据对象被加上排它锁时,其他的事务不能对它读取和修改;加了共享锁的数据对象可...
  • 数据库中的锁机制锁是网络数据库中的一个非常重要的概念,它主要用于多用户环境下保证数据库完整性和一致性。各种大型数据库所采用的锁的基本理论是一致的,但在具体实现上各有差别。目前,大多数数据库管理系统都...
  • MySQL--数据库中的锁

    2016-12-21 09:06:05
    MySQL--数据库中的锁(表锁、行锁)   什么是锁  锁是计算机协调多个进程或纯线程并发访问某一资源的机制。在数据库中,除传统的计算资源(CPU、RAM、I/O)的争用以外,数据也是一种供许多用户共享的资源。如何...
  • 数据库中的锁机制和封锁协议

    千次阅读 2017-07-05 20:18:47
    今天整理一下数据库中的锁机制和封锁协议,锁主要用于解决事务并发控制中产生的一些问题,在此之前我先列举一些相关的基本概念。 事务:用户定义的一个数据库操作序列,这些操作要么全做,要么全不做,是一个不...
  • 在操作Oracle数据库时有时出现疏忽,使数据库某表被锁住了,导致其它操作无法进行,那怎么查看 Oracle 数据库中产生的锁呢? 一,Oracle查看锁 -- oracle 查看产生的锁列表 select s.sid, s.serial# from v$...
  • 数据库管理系统(DBMS)中并发控制任务是确保在多个事务同时存取数据库中同一数据时,不破坏事务隔离性和一致性,以及数据库统一性。 1. 什么是机制?数据库为什么要有锁机制?  机制:通过对访问数据库...
  • Oracle数据库中的锁机制

    千次阅读 2017-07-25 10:03:48
    数据库中有两种基本的锁类型:排它锁(Exclusive Locks,即X锁)和共享锁(Share Locks,即S锁)。当数据对象被加上排它锁时,其他的事务不能对它读取和修改;加了共享锁的数据对象可以被其他
  • SQL Sever数据库中的锁25例

    千次阅读 2012-08-21 11:52:50
    SQL Sever数据库中的锁25例 数据库锁Table of Contents   1 前言 数据库大并发操作要考虑死锁和锁的性能问题。看到网上大多语焉不详(尤其更新锁),所以这里做个简明解释,为下面描述方便,这里用T1代表一个...
  • 数据库中的锁机制

    千次阅读 2013-09-28 17:13:28
    锁是网络数据库中的一个非常重要的概念,它主要用于多用户环境下保证数据库完整性和一致性。各种大型数 据库所采用的锁的基本理论是一致的,但在具体实现上各有差别。目前,大多数数据库管理系统都或多或少具有自我...
  • Oracle数据库中的锁机制研究 作者:CWEEK 本文通过对Oracle数据库锁机制的研究,首先介绍了Oracle数据库锁的种类,并描述了实际应用中遇到的与锁相关的异常情况,特别对经常遇到的由于等待
  • Oracle数据库中的锁机制研究
  • 上一篇文章说完了MVCC,我们知道数据库通过这种类似快照链形式实现了事物并发,MVCC解决了大部分场景下事务之间读写并发,读历史快照,写当前版本,写操作之间是会加锁,不然可能造成脏写; 同时,有...
  • 数据库中的锁与事务

    千次阅读 2016-06-28 16:24:15
    引言什么事事务?事务是一组原子性的SQL语句,这组语句要么全部成功,要么...事务中的隔离性在数据库系统中一般采用来实现,针对不同的隔离级别有不同的隔离策略,要想在性能和隔离性中作出均衡,在数据库系统种是一
  • DB2数据库中的锁和并发性控制 现在的DB2 UDB系统中, 主要通过锁和隔离级别这两个主要的工具来控制并发连接,维护数据库中的数据在高并发的环境下的安全。 我们在这里将简要的阐述一下锁和隔离级别。 锁: DB2...
  •  Oracle数据库中的锁机制研究开发者在线 Builder.com.cn 更新时间:2006-06-20作者:CWEEK 来源:本文关键词: oracle 本文通过对Oracle数据库锁机制的研究,首先介绍了Oracle数据库锁的种类,并描述了...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 18,953
精华内容 7,581
关键字:

数据库中的锁