zoukankan      html  css  js  c++  java
  • 数据库锁的几种类型

    1、共享锁(Shared lock)

      T1: select * from table (请想象它需要执行1个小时之久,后面的sql语句请都这么想象)

      T2: update table set column1='hello' 

      过程:
      T1运行 (加共享锁)
      T2运行
      If T1 还没执行完
        T2等......
      else
        锁被释放
        T2执行
      endif
      T2之所以要等,是因为T2在执行update前,试图对table表加一个排他锁,
      而数据库规定同一资源上不能同时共存共享锁和排他锁。所以T2必须等T1

    2、更新锁(Update lock)

      T1: select * from table(updlock) (加更新锁)

        update table set column1='hello'

      T2: select * from table(updlock)

        update table set column1='world'

      更新锁的意思是:“我现在只想读,你们别人也可以读,但我将来可能会做更新操作,我已经获取了从共享锁(用来读)到排他锁
      (用来更新)的资格”。一个事物只能有一个更新锁获此资格。
      T1执行select,加更新锁。
      T2运行,准备加更新锁,但发现已经有一个更新锁在那儿了,只好等。
      当后来有user3、user4...需要查询table表中的数据时,并不会因为T1的select在执行就被阻塞,照样能查询

    3、排他锁(独占锁,Exclusive Locks) 

      T1: update table set column1='hello' where id<1000

      T2: update table set column1='world' where id>1000

      假设T1先达,T2随后至,这个过程中T1会对id<1000的记录施加排他锁.但不会阻塞T2的update。

    4、意向锁(Intent Locks)

      T1: select * from table (xlock) where id=10 --意思是对id=10这一行强加排他锁
      T2: select * from table (tablock) --意思是要加表级锁

      假设T1先执行,T2后执行,T2执行时,欲加表锁,为判断是否可以加表锁,数据库系统要逐条判断table表每行记录是否已有排他锁,
      如果发现其中一行已经有排他锁了,就不允许再加表锁了。只是这样逐条判断效率太低了。

      实际上,数据库系统不是这样工作的。当T1的select执行时,系统对表table的id=10的这一行加了排他锁,还同时悄悄的对整个表
      加了意向排他锁(IX),当T2执行表锁时,只需要看到这个表已经有意向排他锁存在,就直接等待,而不需要逐条检查资源了。

    5、计划锁(Schema Locks)

      alter table .... (加schema locks,称之为Schema modification (Sch-M) locks

      DDL语句都会加Sch-M锁
      该锁不允许任何其它session连接该表。连都连不了这个表了,当然更不用说想对该表执行什么sql语句了。

  • 相关阅读:
    Asp.net HttpContext 简介
    cxf 调用 .net webservice
    Dapper.Rainbow 简单使用
    Aspose.words 书签定位
    修改WCF的默认序列化格式
    mysql8.0.18忘记密码后重置密码
    聊一聊c#中的MATH.ROUND方法
    Windows上安装MySql
    win7搭建本地SonarQube环境进行c#代码分析
    使用dapper遇到的问题及解决方法
  • 原文地址:https://www.cnblogs.com/liuqing576598117/p/10366233.html
Copyright © 2011-2022 走看看