查看SQL Server被锁的表以及如何解锁

摘要:
SQL Server在读取或修改数据时不应用任何锁。等于SERIALIZABLE事务隔离级别UPDLOCK。如果选择此选项,SQL Server将在读取数据时使用修改锁替换共享锁。使用此选项可以确保多个进程可以同时读取数据,但只有该进程可以修改数据。此选项确保其他进程只能读取数据,不能修改数据。该锁防止任何其他事务使用READPAST表来允许sqlserver在事务期间跳过任何锁定的行。

锁定数据库的一个表的区别
  SELECT * FROM table WITH (HOLDLOCK) 其他事务可以读取表,但不能更新删除
  SELECT * FROM table WITH (TABLOCKX) 其他事务不能读取表,更新和删除

SELECT语句中的各项“加锁选项”以及相应的功能说明。
NOLOCK(不加锁)
此选项被选中时,SQL Server 在读取或修改数据时不加任何锁。 在这种情况下,用户有可能读取到未完成事务(Uncommited Transaction)或回滚(Roll Back)中的数据, 即所谓的“脏数据”。
NOLOCK 语句执行时不发出共享锁,允许脏读 ,等于 READ UNCOMMITTED事务隔离级别

HOLDLOCK(保持锁)
此选项被选中时,SQL Server 会将此共享锁保持至整个事务结束,而不会在途中释放。
HOLDLOCK 持有共享锁,直到整个事务完成,应该在被锁对象不需要时立即释放,等于SERIALIZABLE事务隔离级别

UPDLOCK(修改锁)
此选项被选中时,SQL Server 在读取数据时使用修改锁来代替共享锁,并将此锁保持至整个事务或命令结束。使用此选项能够保证多个进程能同时读取数据但只有该进程能修改数据。

TABLOCK(表锁)
此选项被选中时,SQL Server 将在整个表上置共享锁直至该命令结束。 这个选项保证其他进程只能读取而不能修改数据。

PAGLOCK(页锁)
此选项为默认选项, 当被选中时,SQL Server 使用共享页锁。
PAGLOCK 在使用一个表锁的地方用多个页锁

TABLOCKX(排它表锁)
此选项被选中时,SQL Server 将在整个表上置排它锁直至该命令或事务结束。这将防止其他进程读取或修改表中的数据。 TABLOCKX 强制使用独占表级锁,这个锁在事务期间阻止任何其他事务使用这个表

READPAST 让sql server跳过任何锁定行,执行事务,适用于READ UNCOMMITTED事务隔离级别只跳过RID锁,不跳过页,区域和表锁
ROWLOCK 强制使用行锁
UPLOCK 强制在读表时使用更新而不用共享锁

查看被锁表:
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)

USE master;
GO
EXEC sp_who 'active';
GO
EXEC sp_who2 'active';
GO

USE master;
GO
KILL spid | UOW [WITH STATUSONLY]
GO


select  
    object_name(P.object_id) as TableName,    
    resource_type, resource_description,request_session_id
from
    sys.dm_tran_locks L
    join sys.partitions P on L.resource_associated_entity_id = p.hobt_id
 
 kill ID

--Other Information about Locks:
select * from sys.dm_tran_locks   
SELECT * FROM sys.dm_exec_requests WHERE blocking_session_id<>0 

select * from sys.sysprocesses 

select
  object_name(resource_associated_entity_id) as 'TableName' ,*
from
  sys.dm_tran_locks
where resource_type = 'OBJECT'
  and resource_database_id = DB_ID()
GO



EXEC sp_who active --看哪个引起的阻塞,blk blk<>0

EXEC sp_lock --看锁住了那个资源id,objid objid<>0

参考:https://www.mssqltips.com/sqlservertip/2732/different-techniques-to-identify-blocking-in-sql-server/

https://sites.google.com/site/mssqlserverworkstation/follow-me/blog/howtofindlockedtablesandkillsessioninsqlserver

免责声明:文章转载自《查看SQL Server被锁的表以及如何解锁》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇maven设置本地仓库和远程仓库HTML表格基础详解下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

【Database】MySQL实战45讲

01 | 基础架构:一条SQL查询语句是如何执行的? 1. MySQL 的基本架构图: MySQL可以分成: Server层 和 存储引擎层 两部分。 Server层:包含连接器、查询缓存、分析器、优化器、执行器等等,涵盖 MySQL 的大多数核心服务功能,以及所有的内置函数(日期,时间,数学和加密函数等),所有跨存储引擎的功能都在这一层实现,比如存储过...

Xamarin.Forms 学习系列之优秀UI收集

1、各种优秀UI例子 https://github.com/jsuarezruiz/xamarin-forms-goodlooking-UI 输入框例子 https://github.com/enisn/Xamarin.Forms.InputKit 浮动操作按钮  https://github.com/SuavePirate/Xamarin.Forms...

Windows下Kettle定时任务执行并发送错误信息邮件

Windows下Kettle定时任务执行并发送错误信息邮件 1.首先安装JDK 2.配置JDK环境 3.下载并解压PDI(kettle) 目前我用的是版本V7的,可以直接百度搜索下载社区版,企业版收费,社区版免费 下载地址:https://sourceforge.net/projects/pentaho/files/Data Integration/ 4...

Android学习分享:执行某ViewGroup的动画时,子控件太多导致动画执行卡顿的问题

最近在项目中遇到一个问题,我有一个LinearLayout,里面装载了许多ImageView控件,ImageView控件显示着自己的图片,这个LinearLayout支持双指缩放,缩放采用ScaleAnimation来实现,但是但是在缩放过程中,屏幕十分卡顿,缩放效果根本没有跟上手指的缩放动作。后来在Google上查了一番,查到一个API,叫setAnim...

《转》事务对数据库的重要性

所谓事务是用户定义的一个操作序列,这些操作要么全做要么全不做,是一个不可分割的工作单位。   事务的开始与结束可以由用户显式控制。如果用户没有显式地定义事务,则由DBMS按缺省规定自动划分事务。在SQL语言中,定义事务的语句有三条:    BEGIN TRANSACTION    COMMIT    ROLLBACK   事务通常是以BEGIN TRAN...

Android使用GoogleMap v2(一)

使用之前的一些准备: https://developers.google.com/maps/documentation/android/start#get_an_android_certificate_and_the_google_maps_api_key (官网的详细教程) Creating a new Android application that...