zoukankan      html  css  js  c++  java
  • sql server锁检测

    有时候系统运行老感觉效率不高,并且有时候sql还有超时的报错,但是并发量并不高。通过排查定位sql是否有执行效率问题

    -- 开事务, 以保持锁
    BEGIN TRAN
    
    -- 更新
    update table a 
    set column1 = 1 
    where idx = 1
    
    -- 列出锁信息
    EXEC sp_lock @@spid
    
    -- 提交或者回滚事务
    COMMIT/ROLLBACK TRAN

    通过执行sp_lock存储过程,查看锁信息(类似如下)

    spid dbid ObjId IndId Type Resource Mode Status
    52 8 0 0 DB                                  S GRANT
    52 1 1.12E+09 0 TAB                                  IS GRANT
    52 8 9.18E+08 1 PAG 1:425705                         IX GRANT
    52 8 9.18E+08 0 TAB                                  IX GRANT
    52 8 9.18E+08 1 KEY -1E+10 X GRANT

    通过 dbid, ObjId 可以找到你更新的表相关的锁记录
    如果 IndId 为 0 , 表示锁在表上, 否则在对应的索引上
    通过 Type 列, 可以确定被锁定的是行/表, 或者是其他, 并且可以通过 Mode 看到是什么锁
    在Status 中, 还可以看到锁是已经加上了, 还是在等待其他资源释放(以取得加锁的权利)

    spid   dbid   ObjId       IndId  Type Resource                   Mode     Status
    ------ ------ ----------- ------ ---- -------------------------- -------- ------
    53     1      1115151018  0      TAB                             IS       GRANT

    锁的类型(Tyep 列值, RID 和 KEY 的话, 表示锁在行上) 有如下几种:
    RID = 表中单个行的锁,由行标识符 (RID) 标识。
    KEY = 索引内保护可串行事务中一系列键的锁。
    PAG = 数据页或索引页的锁。
    EXT = 对某区的锁。
    TAB = 整个表(包括所有数据和索引)的锁。
    DB = 数据库的锁。
    FIL = 数据库文件的锁。
    APP = 指定的应用程序资源的锁。
    MD = 元数据或目录信息的锁。
    HBT = 堆或 B 树索引的锁。在 SQL Server 2005 中此信息不完整。
    AU = 分配单元的锁。在 SQL Server 2005 中此信息不完整。

    显示的结果无法知道是哪个对象,可以使用下面的语句来查看
    Select * From sysdatabases where dbid=[dbid]   --数据库
    Select * from sysobjects where id=[ObjId]      --表或其他对象
    Select * from sysindexes where id=[IndId]      --索引
    --此处[]内为表中对应列的值

  • 相关阅读:
    如何安全的创建线程池?
    【Java Proxy Pattern】Java的代理模式
    php全局变量/局部变量/静态变量
    php strstr()
    微信公众号开发(四):js-sdk的应用
    微信公众号平台开发(三):几大微信接口的调用
    php操作数据库
    微信公众号开发(一)--开发模式与编辑模式
    微信公众平台开发(二):交互与接口
    day6 字典的增减查删
  • 原文地址:https://www.cnblogs.com/jiangzhichao/p/4235790.html
Copyright © 2011-2022 走看看