找出SQL Server上的查询中获取的锁?

时间:2009-05-07 12:13:43

标签: sql sql-server sql-server-2005 tsql

我的应用程序中有一条SQL语句。我想知道该声明获得了哪些锁;我怎么能用SQL服务器呢? 该声明涉及僵局,我正在试图分析;我无法重现死锁。 我在MS SQL Server 2005上运行。

6 个答案:

答案 0 :(得分:4)

您可以在事务中运行该语句,但不能提交事务。由于锁将一直保持到提交事务为止,因此您可以有时间检查锁。 (不是无限期,但默认为5分钟。)

像:

BEGIN TRANSACTION
select * from table

然后打开Management Studio并检查锁定。他们在管理层 - >活动监控 - >按对象锁定或按进程锁定。完成后,运行:

COMMIT TRANSACTION

释放锁。

答案 1 :(得分:3)

我建议您在第一个实例中打开死锁检测跟踪标志,而不是无限期地运行Profiler跟踪。

这样,事件详细信息将记录到SQL Server错误日志中。

查看以下联机丛书参考,了解各种跟踪标志的详细信息。您需要使用1204和/或1222

http://msdn.microsoft.com/en-us/library/ms188396(SQL.90).aspx

确保使用服务器范围启用跟踪标志,而不仅仅是当前会话。例如使用:

DBCC TRACEON(1222,-1)

答案 2 :(得分:3)

这是一个查询,它将显示所有活动锁,谁拥有它们以及它们所处的对象。我几年前从一篇Technet文章中提取过这个文章。它适用于SQL 2000和2005(将sysobjects更改为2005年的sys.objects。)如果要将WHERE子句限制为仅此数据库,并且仅限于“EXCLUSIVE”锁定,则取消注释WHERE子句。

select 'Locks' as Locks,
    spid, nt_username, name, hostname, loginame, waittime, open_tran,
    convert(varchar ,getdate() - last_batch, 114) as TimeSinceLastCommand,
    case req_mode
    when  0 then 'Not granted'
    when  1 then 'Schema stability'
    when  2 then 'Schema modification'
    when  3 then 'Intent shared'
    when  4 then 'Shared intent update'
    when  5 then 'Intent shared shared'
    when  6 then 'Intent exclusive'
    when  7 then 'Shared Intent Exclusive'
    when  8 then 'Shared'
    when  9 then 'Update'
    when 10 then 'Intent insert NULL'
    when 11 then 'Intent shared exclusive'
    when 12 then 'Intent update'
    when 13 then 'Intent shared-update'
    when 14 then 'Exclusive'
    when 15 then 'Bulk operation'
    else str(req_mode) end as LockMode
from master..syslockinfo
    left join sysobjects so on so.id = rsc_objid
    left join master..sysprocesses sp on sp.spid = req_spid
--where rsc_dbid = (select db_id()) and ltrim(req_mode) in (6,7,11,14) 

答案 3 :(得分:2)

在探查器中运行跟踪(选择空白模板),选择死锁图事件,并在出现的新选项卡(事件提取设置)上,将每个(在单独检查保存死锁XML事件)保存在自己的文件中。在xml查看器中打开此文件,可以很容易地判断发生了什么。每个进程都包含在内,包含一堆过程调用等,所有锁都在那里。

让这个跟踪运行直到再次发生死锁,仅在发生死锁时记录信息,因此开销不大。如果它再也不会发生,好的就会解决,如果不是你已经捕获了所有的信息。

答案 4 :(得分:0)

您可以在开发框中运行探查器跟踪以查看查询,并确切了解所执行的锁定。这通常是大量数据,但其中大部分都是您可以浏览的模式。例如。对于读取提交的隔离,您将看到在执行表或索引扫描时获取和释放的一系列锁(每行必须在读取之前锁定,并在读取后立即释放)。

你运行的是什么隔离?什么样的查询陷入僵局?您是使用包含多个更新的显式事务,还是单个语句死锁?

死锁的最典型情况是具有序列的事务(更新表x,更新表y),以及具有序列的第二个事务(更新表y,更新表x)。常见的解决方案是确保跨查询使用相同的更新序列。

让我们知道它们是什么类型的查询,不同类型的交易存在不同的常见问题。

答案 5 :(得分:-1)

相关问题