• 第一章 SQLserver锁表与解锁


    某些情况下,SQLserver的表会被锁住,比如某个会话窗口有数据一直没提交,窗口又没关闭,这时表就会被锁住,其他任何连接查询表数据时都不会返回,这时需要手工杀掉产生死锁的会话ID,才能恢复正常。
    

    一、锁表

    #1.方式一:其他事务可以读取表,但不能更新删除
    SELECT * FROM table WITH (HOLDLOCK)
    
    #2.方式二:其他事务不能读取表,更新和删除
    SELECT * FROM table WITH (TABLOCKX)
    

    二、查看被锁表

    select request_session_id spid,OBJECT_NAME(resource_associated_entity_id) tableName
    from sys.dm_tran_locks where resource_type='OBJECT';
    
    # 这时会出现两列数据
    第一列 --spid 锁表进程
    第二列 --tableName 被锁表名
    

    三、解锁

    declare @spid int
    Set @spid = 57 --锁表进程
    declare @sql varchar(1000)
    set @sql='kill '+cast(@spid as varchar)
    exec(@sql)
    

    四、查询出死锁的SPID

    select blocked
    from (select * from sysprocesses where blocked>0 ) a
    where not exists(select * from (select * from sysprocesses where blocked>0 ) b
    where a.blocked=spid)
    

    五、输出引起死锁的操作

    DBCC INPUTBUFFER (@spid)
    

    六、查询当前进程数

    select count(-1) from sysprocesses
    where dbid in (select dbid from sysdatabases where name like '%telcount%');
    

    七、查询不锁表

    如果不想锁表,那就再表名或别名后面加上WITH(NOLOCK)
    
    #示例:
    SELECT Id FROM dbo.T_Table WITH(NOLOCK) WHERE Id = 1
    
  • 相关阅读:
    InitializingBean
    线程池
    maven
    mysql主从库
    zookeeper
    分布式服务框架 Zookeeper -- 管理分布式环境中的数据
    远程调试
    enum
    注解
    Shell错误[: missing `]'
  • 原文地址:https://www.cnblogs.com/jhno1/p/15163213.html
Copyright © 2020-2023  润新知